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
?