Обойти это из-за отсутствия взгляда назад?
Чтобы ответить на вопрос другого пользователя, я собрал следующее регулярное выражение, чтобы сопоставить числа в строке.
\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 в исходном выражении)