正则表达式仅匹配非转义字符

时间:2015-01-23 16:07:44

标签: regex swift

好的,所以我尝试使用正则表达式来匹配角色的实例,只要它没有被转义(使用反斜杠)并且决定使用负面的后卫,如此:

(?<!\\)[*]

此操作成功并按预期失败,分别使用foo*foo\*等字符串。

但是,它对foo\\*之类的字符串不起作用,即 - 特殊字符前面有一个反斜杠转义另一个反斜杠(一个本身是转义的转义序列)。

是否可以使用负面后视(或其他技术)来跳过特殊字符,只要它们前面有奇数个反斜杠?

2 个答案:

答案 0 :(得分:7)

我发现以下解决方案适用于NSRegularExpression,但也适用于我尝试过的所有支持负面观察的regexp实现:

(?<!\\)(?:(\\\\)*)[*]

在这种情况下,第二个不匹配的括号匹配任何反斜杠对,有效地消除它们,此时负面的后视可以按预期比较任何剩余的(奇数编号)反斜杠。

答案 1 :(得分:1)

后视无法解决这个问题。唯一的方法是首先匹配转义字符以避免它们并找到未转义的字符:

您可以使用捕获组将未转义的字符与结果隔离开来:

(?:\\.)+|(\*)

或使用\K(pcre / perl / ruby​​)功能删除结果左侧的所有内容:

(?:\\.)*\K\*

或使用回溯控制动词(pcre / perl)来跳过转义字符:

(?:\\.)+(*SKIP)(*FAIL)|\*

唯一可以使用lookbehind的情况是.net框架允许无限长度的后视:

(?<!(?:[^\\]|\A)(?:\\\\)*\\)\*

或以更有限的方式使用java:

(?<!(?:[^\\]|\A)(?:\\\\){0,1000}\\)\*