处理正则表达式中的单词边界

时间:2013-01-30 23:15:39

标签: ruby regex

在下面的字符串中,我试图匹配独立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中的哪种方法边缘情况最少?
  • 这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

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

第四个表达式有效,因为\B匹配\w\w序列或\W\W序列(或字符串的开头或结尾)的边界,因为&#34 ;"匹配\W\.\B匹配缩小到\W\W(或字符串的结尾),这是您想要的。

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

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

答案 1 :(得分:0)

来自Perl regex documentation

  

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

因为\w代表[a-zA-Z0-9_] \b不匹配。正确地假设。

\bInc\.\B

匹配Inc..Inc.之后的任何非\ w字符

\bInc\.($|\W)

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

\bInc\.(\s|$)