Ruby on rails 为什么是\b";在Rails中听不到我的单词边界?

Ruby on rails 为什么是\b";在Rails中听不到我的单词边界?,ruby-on-rails,ruby,regex,word-boundary,Ruby On Rails,Ruby,Regex,Word Boundary,我使用的是Rails 4.2.7。我想匹配一个表达式并利用单词边界表达式,因为单词之间可能有空格、任意数量的空格或破折号。但这不起作用 2.3.0 :006 > /first\bsecond/.match('first second') => nil 这里的手册-建议使用“\b”是捕捉单词边界的正确表达式,因此我想知道我错在哪里。\b匹配的是零长度单词边界,而不是空格。您正在寻找更像这样的东西: /first\b.\bsecond/.match('first second')

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

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

这里的手册-建议使用“\b”是捕捉单词边界的正确表达式,因此我想知道我错在哪里。

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

/first\b.\bsecond/.match('first second')
/first\ssecond/.match('first second')
这将匹配
第一个
第二个
之间的任何字符(
),只要两边都有单词边界


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

/first\Wsecond/.match('first second')
这与第一个示例完全相同……但是,实际上,您可能只想匹配空白,可以使用如下内容:

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

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

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

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

/first\b.\bsecond/.match('first second')
/first\ssecond/.match('first second')
这将匹配
第一个
第二个
之间的任何字符(
),只要两边都有单词边界


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

/first\Wsecond/.match('first second')
这与第一个示例完全相同……但是,实际上,您可能只想匹配空白,可以使用如下内容:

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

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

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

看<代码> \b//>与空白代码不匹配,在<代码>第一< /代码>和<代码>第二版/代码>之间。“代码> > \b/COD>通常在表达式的开头或结尾使用,因为它在其他地方的实用性是有疑问的。”但这是如此罕见,以至于我想不出一个真实世界的用例。类似的东西是一种有效的用法:<代码> /[AZ] \B[AZ], > Sam Yeah,在中间使用它的情况通常更像是代码> /Test\B.Tys/< /Cord>。但是在这些情况下,它们处于子表达式的开始或结束。这似乎是一个纯粹的红宝石问题。如果是这样,就不应该有Rails标记。请记住,一些成员可能会使用Rails标记过滤掉问题。请参阅<代码> \b//>与空白代码不匹配,在<代码>第一< /代码>和<代码>第二版/代码>之间。“代码> > \b/COD>通常在表达式的开头或结尾使用,因为它在其他地方的实用性是有疑问的。”但这是如此罕见,以至于我想不出一个真实世界的用例。类似的东西是一种有效的用法:<代码> /[AZ] \B[AZ], > Sam Yeah,在中间使用它的情况通常更像是代码> /Test\B.Tys/< /Cord>。但是在这些情况下,它们处于子表达式的开始或结束。这似乎是一个纯粹的红宝石问题。如果是这样,就不应该有Rails标记。请记住,一些成员可能会使用Rails标签过滤掉问题。或
/first\ssecond/
/first second/
/\bfirst second\b/
谢谢@WiktorStribiżew,我只是更新了这个问题来解释为什么在这种情况下通常不使用零长度匹配。谢谢,但是给出的答案对于/first\wssecond/.match('first second')的情况是失败的,因为单词之间有多个空格。@Dave这些例子中的任何一个都可以使用
+
修饰符来表示“一个或多个“,即
/first\W+second/
…或
/first\s second/
/first second/
/\bfirst second\b/
谢谢@WiktorStribiżew,我刚刚更新了这个问题,以解释为什么在这种情况下通常不使用零长度匹配。谢谢,但给出的答案对于/first\wssecond/.match来说是失败的('first second')在whcih中,单词之间有一个以上的空格。@Dave这些示例中的任何一个都可以使用
+
修饰符来表示“一个或多个”,即
/first\W+second/
。。。