RegEx для сбора научных номеров в MATLAB - PullRequest
3 голосов
/ 25 мая 2019

У меня сложилось впечатление, что у меня был бы более элегантный и компактный способ разбора чисел с помощью регулярных выражений. Я умею разбирать числа в нескольких форматах,

str_expr = '[\-\+\d\.E]+';
fruit    = regexp(str_text, str_expr, 'match')

И я знаю, как оглянуться,

(?<=test)expr

Но что, если я хочу сопоставить несколько чисел после определенного "теста"? Я обычно делаю это в двух регулярных выражениях, один для просмотра, а второй для анализа чисел. Например:

str_text = 'bla, ble,... bli, 1     -0.1243E-02    23.123E+03'

% pre-digest: look behind
str_reg1 = '(?<=bli,).*'
fruit    = regexp(str_text, str_reg1, 'match')

% parse numbers
str_reg2 = '[\-\+\d\.E]+'
fruit    = regexp(fruit{1}, str_reg2, 'match')

Если я попытаюсь сделать это за один шаг, я поймаю только первое число

% 1st try..
str_reg_try1 = '(?<=bli,)[\-\+\d\.E]+'
fruit        = regexp(fruit{1}, str_reg_try1, 'match')

% 2nd try..
str_reg_try2 = '(?<=bli,)([\-\+\d\.E]+)+'
fruit        = regexp(fruit{1}, str_reg_try1, 'tokens')

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 25 мая 2019

Если мое предположение может быть близким, то здесь мы собираемся собрать цифры. Я уверен, что нам может потребоваться разбить строку на две или более частей, прежде чем мы передадим ее в движок RegEx:

bla, ble,... bli,
1     -0.1243E-02    23.123E+03

Тогда в этом случае нам может даже не потребоваться регулярное выражение.


Или мы могли бы захотеть просто интегрировать некоторые простые выражения, такие как:

(.+?bli,)|([0-9-E.\-+]+)

Демо

Кроме того, я думаю, что совет от bobble bubble в комментарии - гораздо лучший выбор ( ссылка ):

(?:\G(?!^)|bli,)\s+\K[-+\d.E]+

RegEx

Если это выражение нежелательно, его можно изменить или изменить в regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...