2013-10-24 3 views
2

Я пытаюсь извлечь некоторые результаты из менеджера загрузки, формат:Regex получить несколько сегментов строки в JavaScript

[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]

, что я хотел бы, чтобы извлечь из приведенного выше примера, будет массив, который выглядит следующим образом:

['4.3','MiB','40','MiB','10%','4.9','MiB','7','s']

Я пытался split этого в различных комбинациях, но ничего не кажется правильным. Кто-нибудь будет знать, как это сделать или может предложить предложения?

Спасибо!

+0

Это хитрый ... – subZero

ответ

3

Вы можете сделать

var arr = str.match(/ ([\d\.]+)(\w+)\/([\d\.]+)(\w+)\(([^\)]+)\).*:([\d\.]+)(\w+).*:([\d\.]+)(\w+)/).slice(1) 

С вашей строки, это дает

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", "7", "s"] 

, но это действительно зависит от того, возможно строки. Только с одним примером невозможно быть уверенным. Мой совет должен был бы

  1. Убедитесь, что вы понимаете мое регулярное выражение (читай его шаг за шагом)
  2. испытания и адаптировать с ведома вашего домена

Вот объяснение: В круглых скобках, вы есть группы захвата, вот что мы получаем в массиве. Вот некоторые из них:

  • ([\d\.]+): эта группа состоит из цифр (ов) и точка (ы) (если вы хотите, чтобы убедиться, что есть максимум одна точка, используйте (\d+\.?\d*))
  • (\w+): некоторые буквы
  • ([^\)]+): некоторые символы, которые не закрывающая скобка

Будьте осторожны, если он становится слишком сложным или глубоко структурирована, то регулярные выражения не будет правильным решением, и вам придется использовать логику синтаксического анализа ,


EDIT

После ваши комментарии, чтобы помочь вам с более сложными строками.

Предположив использовать это регулярное выражение:

/ ([\d\.]+)(\w+)\/([\d\.]+)(\w+)\(([^\)]+)\).*:([\d\.]+)(\w+) ETA:(\d+h)?(\d+m)?(\d+s)?/ 

затем

"[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:1h30m7s]" 

даст

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", "1h", "30m", "7s"] 

и

"[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]" 

даст

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", undefined, undefined, "7s"] 

Я изменил конец регулярного выражения. Группа, такая как (\d+h)?, означает «некоторые цифры, за которыми следует h, optionnal».

+0

Как насчет объяснения того, что делает ваше регулярное выражение? :) – subZero

+0

Gross ... но +1 в любом случае: P Почти похоже, что у вас уже было это регулярное выражение в вашем буфере обмена! – Lix

+1

@subZero - ** что ** было бы сложно: P – Lix

0

Во-первых, вам нужно разбить его по пространству. Итак, отбросьте первый элемент, выберите второй, разделите по верхнему регистру, получите первый, т. Е. 4.3, затем разделите второй на /, выберите первый и у вас будет MiB, снова разделите его на верхний регистр, и у вас будет 40, и последний раскол не-буквенно-цифровой полукокса .. и так далее ..

1

Я хотел бы предложить другое регулярное выражение, как правило, .* не очень хорошо, если по какой-то причине изменение вашего ввода будет терпеть неудачу и вернуть неверные результаты. Поэтому вместо этого вы убедитесь, что все это соответствует тому, что у вас есть формат, который вы ожидаете.

Следуйте за моим регулярным выражением, оно имеет немного отличающийся выход, чем запрос OP.

Тест строка: [#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]

/\[(#\w+) (\d+.?\d*\w+)/(\d+.?\d*\w+)\((\d+%)\) CN:(\d+) DL:(\d+.?\d*\w+) ETA:(\w+)\]/ 

enter image description here

Regex разбиты

regex part   matched part captured part 
------------------------------------------------- 
\[     [ 
(#\w+)    #8760e4  #8760e4 
\s 
(\d+.?\d*\w+)  4.3MiB   4.3MiB 
/    /
(\d+.?\d*\w+)  40MiB   40MiB 
\((\d+%)\)   (10%)   10% 
\s 
CN:(\d+)   CN:2   2 
\s 
DL:(\d+.?\d*\w+) DL:4.9MiB  4.9MiB 
\s 
ETA:(\w+)   ETA:7s   7s 
\]     ] 

Выход:

["#8760e4", "4.3MiB", "40MiB", "10%", "2", "4.9MiB", "7s"] 
Смежные вопросы