如何在Ruby中“看后面”正则表达式?

时间:2013-09-18 18:40:22

标签: ruby regex

我很困惑为什么在以下示例#2不起作用且#3有效。

 #1. get `o` if immediately preceded by J
"Jones Bond".scan(/(?<=J)o/) #=> o

 #2. get `o` if preceded by J anywhere. Since `J` occurs once I am using `+`
"James Bond".scan(/(?<=J)+o/) #=> []  empty

 #3. get `o` if preceded by J anywhere zero or more times by using `*`
"James Bond".scan(/(?<=J)*o/) #=> o

我将lookbehind翻译为left-to-right,将lookahead翻译为right-to-left以便轻松记住。这是对的吗?

1 个答案:

答案 0 :(得分:1)

第二个例子不起作用,因为当你向后看时你必须使用固定大小的字符串。你可以这样做:

puts "James Bond".scan(/(J.*)(o)/)[0][1]

J.* - 意味着&#39; J&#39;后跟任意数量的字符 - 取结果数组([0])并返回第二组([1])

至于#3,因为你想找到&#39; o&#39;如果之前有&#39; J&#39;零次或多次,你根本不必使用lookbehind,只需搜索&#39; o&#39;:

"James Bond".scan(/(o)/)