我很困惑为什么在以下示例#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
以便轻松记住。这是对的吗?
答案 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)/)