为什么“\b”没有捕捉到我在 Rails 中的单词边界?

Why is "\b" not catching my word boundary in Rails?

我正在使用 Rails 4.2.7。我想匹配一个表达式并利用单词边界表达式,因为我的单词之间可能有 space、任意数量的 space 或破折号。但这行不通

2.3.0 :006 > /first\bsecond/.match('first second')
 => nil

此处的手册 — https://ruby-doc.org/core-2.1.1/Regexp.html 建议“\b”是用于捕捉单词边界的正确表达式,所以我想知道我哪里出错了。

\b 匹配零长度单词边界,而不是 space。您正在寻找更像这样的东西:

/first\b.\bsecond/.match('first second')

这将匹配 firstsecond 之间的任何字符 (.),只要两侧有单词边界即可。


但是,这不是通常使用单词边界的方式(因为在匹配单词边界本身时不需要使用零长度检查)。 \b 本质上是在单词字符之后寻找非单词字符;因此,您可以只在 first 中的 tsecond 中的 s 之间寻找非单词字符:

/first\Wsecond/.match('first second')

这与第一个示例完全相同...但是,实际上,您可能只想匹配白色space 并且可以使用如下内容:

/first\ssecond/.match('first second')

@WiktorStribiżew 的第三个示例展示了单词边界(在开头和结尾)的最佳用法。这是因为您之前或之后都没有匹配任何内容,因此零长度测试很有帮助。否则,上面的示例可能会匹配 first secondary 之类的内容。最后,我会使用这样的表达式:

/\bfirst\ssecond\b/.match('first second')