考虑字符串:
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>"]
我不知道该怎么做。我曾想过使用负后视来防止奇数个\
,但 Ruby 不支持任意长度的后视。\
我还想过尝试在后向检查单个 之前消耗偶数\
,如下所示:
/(?:\\\\)*(?<!\\)<.*?>/
但看起来后面的人仍然可以“看到”前一组消耗的字符。
我如何匹配某些东西,除非它前面有奇数个转义字符?