【问题标题】:How Regexp anchors \B and \b differs from each other?正则表达式锚 \B 和 \b 如何彼此不同?
【发布时间】:2013-01-16 15:13:42
【问题描述】:

我刚刚对 \B\b 有了一些概念。并且accordinlgy 尝试了一个代码(取自互联网)但无法理解 - 那些regexp Anchors 是如何生成输出的。所以任何人请帮助我理解\B\b 之间的区别,在内部说明它们在Ruby 中的pattern matching 是如何处理的?

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"]
> 

谢谢,

【问题讨论】:

  • 为什么在str 的上述输出中出现2??4 而不是2x4

标签: ruby regex ruby-1.9.3


【解决方案1】:

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

\b 匹配一个单词边界——也就是说,它匹配两个字母之间的(因为它是一个零宽度匹配,即它不消耗一个字符匹配时)其中一个属于一个单词而另一个不属于。在文本“this person”中,\b 将匹配以下位置(用竖线表示):“|this| |person|”。

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

因此,如果您有\w+\b 并匹配“this person”,那么您将得到“this”的结果,因为+ 是贪婪的并且匹配尽可能多的单词字符(\w),最多下一个单词边界。

\w+\B 的操作类似,但它不能匹配“this”,因为它后面是单词边界,\B 禁止。所以引擎会回溯一个字符并匹配“thi”。

【讨论】:

  • 我理解,但部分理解!能不能把你在帖子里说的话形象化。这可能有助于我快速记住这个概念!在我的示例句子中还有一个简短的想法与我的示例what are word boundaries
  • @DoLoveSky 我能想到的最好的可视化实际上是第二段和第三段中的那个,我用竖线显示了两个表达式的潜在匹配位置。
  • regular-expressions.info/engine.html @DoLoveSky,一旦你对正则表达式引擎如何匹配表达式有了一个真正扎实的概念,你就会更容易理解与正则表达式相关的任何事情。我强烈建议您从那里开始。
  • @KonradRudolph 这里还有一个问题 - 为什么2×4\n­ 没有出现在输出str.scan(/­\w+\B/) 中?
  • @DoLoveSky 我很困惑:为什么会这样?首先,字符串不包含单词边界,因为没有单词字符,因此\B 从不匹配(但是\w 匹配,因为它匹配字母和数字;嗯,技术上是@987654342 @ 在\n 之后匹配)。其次,即使它 did 匹配,您的表达式也会以破折号开头,而该破折号不会出现在字符串中的任何位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多