好的,所以我尝试使用正则表达式来匹配角色的实例,只要它没有被转义(使用反斜杠)并且决定使用负面的后卫,如此:
(?<!\\)[*]
此操作成功并按预期失败,分别使用foo*
和foo\*
等字符串。
但是,它对foo\\*
之类的字符串不起作用,即 - 特殊字符前面有一个反斜杠转义另一个反斜杠(一个本身是转义的转义序列)。
是否可以使用负面后视(或其他技术)来跳过特殊字符,只要它们前面有奇数个反斜杠?
答案 0 :(得分:7)
我发现以下解决方案适用于NSRegularExpression
,但也适用于我尝试过的所有支持负面观察的regexp实现:
(?<!\\)(?:(\\\\)*)[*]
在这种情况下,第二个不匹配的括号匹配任何反斜杠对,有效地消除它们,此时负面的后视可以按预期比较任何剩余的(奇数编号)反斜杠。
答案 1 :(得分:1)
后视无法解决这个问题。唯一的方法是首先匹配转义字符以避免它们并找到未转义的字符:
您可以使用捕获组将未转义的字符与结果隔离开来:
(?:\\.)+|(\*)
或使用\K
(pcre / perl / ruby)功能删除结果左侧的所有内容:
(?:\\.)*\K\*
或使用回溯控制动词(pcre / perl)来跳过转义字符:
(?:\\.)+(*SKIP)(*FAIL)|\*
唯一可以使用lookbehind的情况是.net框架允许无限长度的后视:
(?<!(?:[^\\]|\A)(?:\\\\)*\\)\*
或以更有限的方式使用java:
(?<!(?:[^\\]|\A)(?:\\\\){0,1000}\\)\*