Ruby扫描标记,除非转义未转义\

时间:2013-04-03 10:43:10

标签: ruby regex escaping

考虑字符串:

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。我还想过在单一\的后观检查之前尝试使用偶数\,如下所示:

/(?:\\\\)*(?<!\\)<.*?>/

但看起来后卫仍然可以“看到”前一组所消耗的角色。

我怎样才能匹配某些内容,除非前面有奇数个转义字符?

1 个答案:

答案 0 :(得分:2)

正则表达式(?<!\\)(?:\\\\)*保证偶数个反斜杠。

细分:(?:\\\\)正好匹配2个反斜杠。 *使其匹配0,2,4等。(?<!\\)确保我们匹配的偶数反斜杠前面没有另一个反斜杠(这会使数字变为奇数)。