Java 正则表达式仅匹配未转换的特殊字符

Java 正则表达式仅匹配未转换的特殊字符,java,regex,Java,Regex,我试图找到一个正则表达式,它只能匹配字符串中前面没有特殊转义序列的字符 例如,在字符串中是?搁浅//?,我希望能够用另一个字符串替换尚未转义的?,这样我可以得到以下结果:**Dave搁浅了吗?** 但就我的一生而言,我还没有找到一条路。我只提出了使用所有可替换字符的正则表达式 如何构造只匹配前面没有转义序列的字符的正则表达式?匹配转义序列以外的一组字符,然后匹配正则表达式特殊字符。第一位可以使用倒排字符类([^/])。特殊情况字符串前面的未转换正则表达式字符。尝试匹配: (^|(^.)|(.[^

我试图找到一个正则表达式,它只能匹配字符串中前面没有特殊转义序列的字符

例如,在字符串中
是?搁浅//?
,我希望能够用另一个字符串替换尚未转义的
,这样我可以得到以下结果:
**Dave搁浅了吗?**

但就我的一生而言,我还没有找到一条路。我只提出了使用所有可替换字符的正则表达式


如何构造只匹配前面没有转义序列的字符的正则表达式?

匹配转义序列以外的一组字符,然后匹配正则表达式特殊字符。第一位可以使用倒排字符类(
[^/]
)。特殊情况字符串前面的未转换正则表达式字符。

尝试匹配:

(^|(^.)|(.[^/])|([^/].))[special characters list]

使用分组。这里有一个例子:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("([^/][^/])(\\?)");
        String s = "Is ? stranded//?";
        Matcher m = p.matcher(s);
        if (m.matches)
            s = m.replaceAll("$1XXX").replace("//", "");
        System.out.println(s + " -> " + s);
    }
}
输出:

$ java Test
Is ? stranded//? -> Is XXX stranded?
在本例中,我是:

  • 首先替换任何未转义的?加上“XXX”
  • 然后,删除“/”转义序列
编辑使用
if(m.matches)
确保正确处理不匹配的字符串


这只是一个又快又脏的例子。显然,你需要充实它,使它更加健壮。但是它能让大家明白这个想法。

使用消极的回顾,这就是他们设计的目的

(?)? 要阻止它,请执行以下操作:

(
    ?<!    #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("(?<!//)[\\?]");
Pattern p=Pattern.compile(“(?
String aString=“Is?standing/?”;
String regex=“(?尝试以下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);

我在考虑这个问题,有了第二个更简单的解决方案,避免使用正则表达式。其他答案可能更好,但我想我还是可以发布它

String input = "Is ? stranded//?"; 
String output = input
    .replace("//?", "a717efbc-84a9-46bf-b1be-8a9fb714fce8")
    .replace("?", "Dave")
    .replace("a717efbc-84a9-46bf-b1be-8a9fb714fce8", "?");
只需将“//”替换为唯一的(如guid)即可保护它。这样,您就知道任何剩余的问号都是公平的游戏。

我使用了这个:

((?:^|[^\\])(?:\\\\)*[ESCAPABLE CHARACTERS HERE])

演示:

如果输入字符串是
,会发生什么?是搁浅的!
或者甚至只删除一个斜杠:
你好David/?
是的,这是一个边缘情况。我在没有考虑这些的情况下解决了这个问题。请参阅我的编辑。我打算将此作为如何构建与所需子字符串匹配的正则表达式的快速示例,而不是一般示例一个真正的解决方案应该考虑那些边缘情况。感谢一堆-我特别发现这是有用的,在做参数化替换,其中令牌用作占位符其他斯特林西假设你可以写一个类似的版本使用正则表达式,如果你想要更多的SPE。字符。如果有两个斜杠:
\\?
,那么第一个斜杠转义第二个斜杠,第二个斜杠不转义
String input = "Is ? stranded//?"; 
String output = input
    .replace("//?", "a717efbc-84a9-46bf-b1be-8a9fb714fce8")
    .replace("?", "Dave")
    .replace("a717efbc-84a9-46bf-b1be-8a9fb714fce8", "?");
((?:^|[^\\])(?:\\\\)*[ESCAPABLE CHARACTERS HERE])