0

我很困惑为什么在以下示例#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

我翻译lookbehindasleft-to-rightlookaheadasright-to-left很容易记住。这是对的吗?

4

1 回答 1

1

第二个示例不起作用,因为您在查看时必须使用固定大小的字符串。您可以改为:

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

J.*- 表示 'J' 后跟任意数量的字符 - 它采用结果数组 ([0]) 并返回第二组 ([1])

至于#3,既然你想找到'o'如果前面有'J'零次或多次,你根本不必使用lookbehind,只需搜索'o':

"James Bond".scan(/(o)/)
于 2013-09-18T18:53:47.457 回答