仅用于匹配未转义特殊字符的正则表达式

2022-09-03 15:16:33

我正在尝试提出一个正则表达式,该表达式只能匹配字符串中不具有特殊转义序列的字符。

例如,在字符串中,我希望能够用另一个字符串替换尚未转义的哪个,所以我可以得到这个结果:Is ? stranded//??**Is Dave stranded?**

但是对于我的生活,我无法找到一种方法。我只想出了吃掉所有可替换字符的正则表达式。

如何构造仅匹配不带转义序列的字符的正则表达式?


答案 1

使用负面的眼光,这就是他们被设计的目的!

(?<!//)[?]

要分解它:

(
    ?<!    #The negative look behind.  It will check that the following slashes do not exist.
    //     #The slashes you are trying to avoid.
)
[\?]       #Your special charactor list.

仅当找不到 // 时,它将随着搜索的其余部分而进行。

我认为在Java中,它需要再次作为字符串转义,如下所示:

Pattern p = Pattern.compile("(?<!//)[\\?]");

答案 2

试试这个Java代码:

str="Is ? stranded//?";
Pattern p = Pattern.compile("(?<!//)([?])");
m = p.matcher(str);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, m.group(1).replace("?", "Dave"));
}
m.appendTail(sb);
String s = sb.toString().replace("//", "");
System.out.println("Output: " + s);

输出

Output: Is Dave stranded?