考虑一下字符串:

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不支持任意长度的lookbehind。我还想在lookbehind检查单个\之前尝试使用偶数个\,如下所示:
/(?:\\\\)*(?<!\\)<.*?>/

但看起来,lookbehind仍然可以“看到”前一组使用的字符。
除非前面有奇数个转义字符,否则如何匹配?

最佳答案

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

07-24 12:52