Ruby Regexp锚定\B和\B的区别是什么?

Ruby Regexp锚定\B和\B的区别是什么?,ruby,regex,ruby-1.9.3,Ruby,Regex,Ruby 1.9.3,我刚刚对\B和\B有了一些概念。Accordinly尝试了一段代码(取自互联网),但无法理解这些regexp锚如何生成输出。因此,任何人都可以帮助我理解\B和\B之间的区别,在Ruby中告诉我它们是如何进行模式匹配的 Interactive ruby ready. > str = "Hit him on the head\­n" + "Hit him on the head with a 2×4\n­" => "Hit him on the head Hit him on

我刚刚对
\B
\B
有了一些概念。Accordinly尝试了一段代码(取自互联网),但无法理解这些
regexp锚如何生成输出。因此,任何人都可以帮助我理解
\B
\B
之间的区别,在Ruby中告诉我它们是如何进行
模式匹配的

Interactive ruby ready.
> str = "Hit him on the head\­n" +
      "Hit him on the head with a 2×4\n­"
=> "Hit him on the head
Hit him on the head with a 2??4
"
> str.scan(/­\w+\B/)
=> ["Hi", "hi", "o", "th", "hea", "Hi", "hi", "o", "th", "hea", "wit"]
> str.scan(/­\w+\b/)
=> ["Hit", "him", "on", "the", "head", "Hit", "him", "on", "the", "head", "with", "a", "2", "4"]
> 

谢谢,

像大多数小写/大写字母对一样,它们是完全相反的:

\b
匹配单词边界–即,它在两个字母之间匹配(因为它是零宽度匹配,即匹配时不使用字符),其中一个字母属于单词,另一个不属于单词。在文本“
此人
”中,
\b
将匹配以下位置(用竖条表示):“
|此人|

\B
匹配除单词边界以外的任何位置。它将在以下位置匹配:“
t | h | i | s p | e | r | s | o | n
”——即在所有字母之间,但不在字母和非字母字符之间

因此,如果你有
\w+\b
并匹配“
这个人”
,那么你会得到一个结果“
这个
”,因为
+
是贪婪的,并且匹配尽可能多的单词字符(
\w
),直到下一个单词边界


\w+\B
的操作与此类似,但它不能匹配“
”,因为它后面有一个单词边界,而
\B
禁止。因此引擎回溯一个字符并匹配“
”相反。

我理解,但部分理解!你在帖子中说的话可以形象化吗。这可能有助于我快速记住这个概念!还有一个简单的想法,我的示例senteces中的单词边界是什么?@DoLoveSky我能想到的最好的形象化实际上是第二段和第三段中的一个h、 在这里,我用竖线显示了两个表达式的潜在匹配位置。@DoLoveSky,一旦你真正了解了正则表达式引擎如何匹配表达式,你就会更容易理解与正则表达式相关的任何内容。我强烈建议你从这里开始。@KonradRudolph这里还有一个问题-为什么
2×4\n­
这个的输出
str.scan(/..\w+\B/)
中没有出现?@DoLoveSky我很困惑:为什么会出现?首先,字符串没有单词边界,因为没有单词字符,因此
\B
从不匹配(
\w
,但是,确实如此,因为它匹配字母和数字;从技术上讲,
\B
\n
之后匹配)。其次,即使它匹配,表达式也会以一个破折号开始,而该破折号不在字符串中出现。为什么在上面的
str
输出中出现
2??4
,而不是
2x4