1

在下面的字符串中,我试图匹配独立Inc.的 s。

Inc. aa Inc. bbbInc. Inc.

以下正则表达式不起作用:

/\bInc\.\b/       # got zero matches
/\bInc\.(\b|$)/   # matched the last Inc.

我认为这是因为\b匹配单词和非单词字符之间的边界,我在\b之后\.有一个非单词字符。我对其进行了调整以使其工作。

/\bInc\.($|\W)/
/\bInc\.\B/
  • 我无法理解为什么第四个表达式有效。
  • 3 和 4 中哪种方法的边缘情况最少?
  • 这个问题有更好的解决方案吗?
4

2 回答 2

2

您想匹配"Inc."后跟一个非单词字符。由于"."是非单词字符,因此您在结束边界处期望的是一个\W\W序列(或字符串的结尾)。匹配 a或序列\b的边界,因此其匹配不会与预期匹配相交。\w\W\W\w

第四个表达式有效,因为\B匹配\w\w序列或\W\W序列(或字符串的开头或结尾)的边界,并且因为“。” matches \W\.\B匹配范围缩小到\W\W您想要的(或字符串的结尾)。

比较第三个和第四个表达式,第三个有两个问题。(1) 注意\W匹配一个字符串。因此,/\bInc\.($|\W)/将在匹配中包含您想要的部分后面的字符。为了避免这种情况,您可以使用前瞻:/\bInc\.(?=$|\W)/,但与此相比,第四个要好得多。(2) 虽然这不是您的特定示例的问题,但当字符串超出单行时,$将无法正确匹配字符串的结尾。使用\z更好。

我想不出比你的第四个更好的了。

于 2013-01-30T23:57:29.913 回答
0

来自Perl 正则表达式文档

单词边界 (\b ) 是两个字符之间的一个点,其中一个 \w 在它的一侧,一个 \W 在它的另一侧(以任意顺序),计算从开头和结尾开始的虚构字符与 \W 匹配的字符串。

因为\w代表[a-zA-Z0-9_] \b不会匹配 . 正如您正确假设的那样。

\bInc\.\B

将匹配Inc..,或任何非 \w 字符后Inc.相同

\bInc\.($|\W)

如果您想匹配Inc.后跟空格或换行符,我会使用

\bInc\.(\s|$)
于 2013-01-30T23:25:34.283 回答