考虑字符串:
Hello <name>! I hear you like \<div> tags! Isn't that <adjective>?
我希望能够扫描字符串中<(.*?)>
的出现次数,以便进行变量插值;但我不想接受转义事件(如上面的\<div>
)。
到目前为止,这么容易:使用负面观察我可以做到:
str.scan(/(?<!\\)<.*?>/)
# => ["<name>", "<adjective>"]
但我也希望允许转义\
字符:
# str is:
# Hello <name>! Do you like escaping \\<thing>? I like \\\<lots> of escapes.
str.scan(re)
# Should give ["<name>", "<thing>"]
我无法弄清楚如何做到这一点。我想过使用负面的lookbehind来防止奇数\
,但Ruby不支持任意长度的lookbehinds。我还想过在单一\
的后观检查之前尝试使用偶数\
,如下所示:
/(?:\\\\)*(?<!\\)<.*?>/
但看起来后卫仍然可以“看到”前一组所消耗的角色。
我怎样才能匹配某些内容,除非前面有奇数个转义字符?
答案 0 :(得分:2)
正则表达式(?<!\\)(?:\\\\)*
保证偶数个反斜杠。
细分:(?:\\\\)
正好匹配2个反斜杠。 *
使其匹配0,2,4等。(?<!\\)
确保我们匹配的偶数反斜杠前面没有另一个反斜杠(这会使数字变为奇数)。