Обойти это из-за отсутствия взгляда назад?

Чтобы ответить на вопрос другого пользователя, я собрал следующее регулярное выражение, чтобы сопоставить числа в строке.

\b[+-]?[0-9]+(\.[0-9]+)?\b

После предоставления моего ответа я заметил, что получаю нежелательные совпадения в тех случаях, когда существует последовательность цифр с более чем одним периодом из-за того, что \ b соответствует символу периода. Например "2.3.4" вернет спички "2.3" а также "4",

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

\b(?<!\.)[+-]?[0-9]+(\.[0-9]+)?\b(?!\.)

... за исключением того, что по неизвестной причине VBScript Regex (и, соответственно, VBA) не поддерживает просмотр назад.

Есть ли обходной путь, который позволяет мне утверждать, что граница слова в начале матча не является точкой без включения ее в матч?

1 ответ

Решение

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

(?:[^.]|^)\b([+-]?([0-9]+(\.[0-9]+)))\b(?!\.)

Будет соответствовать:

2.5      
54.5
+3.45
-0.5

Не будет соответствовать:

1.2.3
3.6.
.3.5
  • Группа захвата 1 выведет целое число и подпишет
  • Группа захвата 2 выведет целое число
  • Группа захвата 3 выведет дробь (как группа захвата 1 в исходном выражении)
Другие вопросы по тегам