考虑一下字符串:
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等匹配。(?<!\\)
确保我们匹配的反斜杠的偶数前面没有另一个反斜杠(这会使数字变奇数)。