缺少后视的解决方法?

Workaround for the lack of lookbehind?

为了回答 another user's question 我拼凑了下面的正则表达式来匹配字符串中的数字。

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

在提供我的答案后,我注意到,由于 \b 与句点字符匹配,在数字序列中有多个句点的情况下,我得到了不需要的匹配项。例如 "2.3.4" 将 return 匹配 "2.3""4".

负面的前瞻和后视可以帮助我,给我一个像这样的正则表达式:

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

...除了出于某些未知原因 VBScript Regex(以及扩展 VBA)不支持后视。

是否有一些变通方法可以让我确认匹配开始时的单词边界不是句点而不将其包含在匹配中?

也许你不需要回头看。如果您能够提取特定的捕获组而不是整个匹配项,那么您可以使用:

(?:[^.]|^)\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)