字边界元字符(\ b)意外地更改正则表达式行为

时间:2014-07-15 06:11:10

标签: ruby regex

我正在修改一个复杂的正则表达式,它从Ruby 2.1.1中的文本中提取URL。

我发现\ b元字符的存在改变了处理路径的正则表达式的特定部分的行为。

str = "/foo/bar/"
str =~ /((?:\/\w+)+\/?)/   # 0
$1                         # => "/foo/bar/"

str =~ /((?:\/\w+)+\/?)\b/ # 0
$1                         # => "/foo/bar"

为什么呢?我希望/?是贪婪的,并且尽管最后存在\ b,但仍会捕获尾随斜线。

1 个答案:

答案 0 :(得分:6)

你是对的:?量词是贪婪的

首先,引擎贪婪地匹配尾部斜杠/。然后引擎在模式和字符串中前进,但在该新位置(在尾随/之后),它无法匹配下一个标记\b。这是因为\b只能在单词字符(字母,数字或下划线)和非单词字符串或字符串的开头或结尾之间匹配:它在/之后无法匹配 - 除非跟着它有一个字符。

引擎回溯并删除可选的尾部斜杠

由于\b无法匹配,为了返回匹配项,引擎会尝试回溯。它回溯并删除可选的尾部斜杠。这允许\br之后匹配,解释/foo/bar