3

考虑字符串:

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 不支持任意长度的后视。\我还想过尝试在后向检查单个 之前消耗偶数\,如下所示:

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

但看起来后面的人仍然可以“看到”前一组消耗的字符。

我如何匹配某些东西,除非它前面有奇数个转义字符?

4

1 回答 1

2

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

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

于 2013-04-03T10:48:41.313 回答