Вы можете сделать
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"]
, но это действительно зависит от того, возможно строки. Только с одним примером невозможно быть уверенным. Мой совет должен был бы
- Убедитесь, что вы понимаете мое регулярное выражение (читай его шаг за шагом)
- испытания и адаптировать с ведома вашего домена
Вот объяснение: В круглых скобках, вы есть группы захвата, вот что мы получаем в массиве. Вот некоторые из них:
([\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».
Это хитрый ... – subZero