为什么“\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')
这将匹配 first
和 second
之间的任何字符 (.
),只要两侧有单词边界即可。
但是,这不是通常使用单词边界的方式(因为在匹配单词边界本身时不需要使用零长度检查)。 \b
本质上是在单词字符之后寻找非单词字符;因此,您可以只在 first
中的 t
和 second
中的 s
之间寻找非单词字符:
/first\Wsecond/.match('first second')
这与第一个示例完全相同...但是,实际上,您可能只想匹配白色space 并且可以使用如下内容:
/first\ssecond/.match('first second')
@WiktorStribiżew 的第三个示例展示了单词边界(在开头和结尾)的最佳用法。这是因为您之前或之后都没有匹配任何内容,因此零长度测试很有帮助。否则,上面的示例可能会匹配 first secondary
之类的内容。最后,我会使用这样的表达式:
/\bfirst\ssecond\b/.match('first second')
我正在使用 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')
这将匹配 first
和 second
之间的任何字符 (.
),只要两侧有单词边界即可。
但是,这不是通常使用单词边界的方式(因为在匹配单词边界本身时不需要使用零长度检查)。 \b
本质上是在单词字符之后寻找非单词字符;因此,您可以只在 first
中的 t
和 second
中的 s
之间寻找非单词字符:
/first\Wsecond/.match('first second')
这与第一个示例完全相同...但是,实际上,您可能只想匹配白色space 并且可以使用如下内容:
/first\ssecond/.match('first second')
@WiktorStribiżew 的第三个示例展示了单词边界(在开头和结尾)的最佳用法。这是因为您之前或之后都没有匹配任何内容,因此零长度测试很有帮助。否则,上面的示例可能会匹配 first secondary
之类的内容。最后,我会使用这样的表达式:
/\bfirst\ssecond\b/.match('first second')