我正在修改一个复杂的正则表达式,它从Ruby 2.1.1中的文本中提取URL。
我发现\ b元字符的存在改变了处理路径的正则表达式的特定部分的行为。
str = "/foo/bar/"
str =~ /((?:\/\w+)+\/?)/ # 0
$1 # => "/foo/bar/"
str =~ /((?:\/\w+)+\/?)\b/ # 0
$1 # => "/foo/bar"
为什么呢?我希望/?是贪婪的,并且尽管最后存在\ b,但仍会捕获尾随斜线。
答案 0 :(得分:6)
你是对的:?
量词是贪婪的
首先,引擎贪婪地匹配尾部斜杠/
。然后引擎在模式和字符串中前进,但在该新位置(在尾随/
之后),它无法匹配下一个标记\b
。这是因为\b
只能在单词字符(字母,数字或下划线)和非单词字符串或字符串的开头或结尾之间匹配:它在/
之后无法匹配 - 除非跟着它有一个字符。
引擎回溯并删除可选的尾部斜杠
由于\b
无法匹配,为了返回匹配项,引擎会尝试回溯。它回溯并删除可选的尾部斜杠。这允许\b
在r
之后匹配,解释/foo/bar
。