Вопрос

Я использую обертки из байтовой расчески (http://bytecomb.com/regular-expressions-in-vba/) Кажется, они работают очень хорошо. Мне нужна помощь в разработке надежных узоров.

Я испытываю неожиданные результаты при комбинировании Lookahead "(? =)" С или "|".

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

«Ирак» и «бросить» работают, как и ожидалось. Для следующего набора строк входного текста я надеюсь извлечь «67,89» и для третьего ».89". Первоначально я сформулировал d+.? D*|. D+ для плавающего десятичного числа, чтобы покрыть обе ситуации. Добавление скобки не помогло. Удаление или помог за 67,89. Наконец я нашел рабочее решение. Но есть ли что -то лучше? Можете ли вы помочь мне понять заказ приоритета? Если возможно, я хотел бы сохранить две части или вместе.

Спасибо, не программист!

Это было полезно?

Решение

\d+\.?\d*|\.\d+(?=\s*ch) Применяется к «STA.23.5 .1 Слова 67.89 CH». Сначала захватывает 23,5, потому что это соответствует \d+\.?\d*

Или "|" Имеет самый высокий приоритет, если вы хотите думать об этом так, разделяя шаблон на два возможных матча: \d+\.?\d* а также \.\d+(?=\s*ch)

Если вы хотите предотвратить \d+\.?d* От сопоставления 23,5 вам придется добавить дополнительные критерии, например, требует космического персонажа перед ним и использование захвата скобков, чтобы получить число в качестве подводного соглашения: \s(\d+\.?\d*)

Вы можете сопоставить оба с этим шаблоном, \s(\d+\.?\d*)|\.\d+(?=\s*ch), но имейте в виду, что если первая половина соответствует, вы будете смотреть на подборки для фактического значения.

Настоящая проблема здесь заключается в том, что класс Regexp VBScript не поддерживает LOUSTBEHIND, просто Lookahead.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top