我试图replaceAll在Java中为该方法创建一个正则表达式.测试字符串是abXYabcXYZ,模式是abc.我想替换除了模式之外的任何符号+.例如,字符串abXYabcXYZ和模式[^(abc)]应该返回++++abc+++,但在我的情况下它返回ab++abc+++.
public static String plusOut(String str, String pattern) {
pattern= "[^("+pattern+")]" + "".toLowerCase();
return str.toLowerCase().replaceAll(pattern, "+");
}
public static void main(String[] args) {
String text = "abXYabcXYZ";
String pattern = "abc";
System.out.println(plusOut(text, pattern));
}
Run Code Online (Sandbox Code Playgroud)
当我尝试更换模式时+没有问题 - abXYabcXYZ模式(abc)返回abxy+xyz.Pattern (^(abc))返回字符串而不替换.
还有其他方法可以将NOT(正则表达式)或组符号写成单词吗?
Fer*_*yer 11
你想要实现的是正则表达式非常困难,因为没有办法表达"替换不匹配模式的字符串".您将不得不使用"积极"模式,告诉匹配什么,而不是匹配什么.
此外,您希望用替换字符替换每个字符,因此您必须确保您的模式恰好与一个字符匹配.否则,您将使用单个字符替换整个字符串,返回较短的字符串.
对于您的玩具示例,您可以使用负向前瞻和后视来完成任务,但对于具有更长或更复杂字符串的实际示例,这可能更难,因为您必须分别考虑字符串的每个字符,以及它的背景.
这是"不'abc'"的模式:
[^abc]|a(?!bc)|(?<!a)b|b(?!c)|(?<!ab)c
Run Code Online (Sandbox Code Playgroud)
它由五个子模式组成,用"或"(|)连接,每个都匹配一个字符:
[^abc]每个字符匹配除a,b或ca(?!bc)匹配a如果没有跟着bc(?<!a)b匹配,b如果它没有前面ab(?!c)匹配b如果没有跟着c(?<!ab)c匹配,c如果它没有前面ab我们的想法是匹配目标单词中不存在的abc每个字符,以及根据上下文不属于您单词的每个单词字符.可以使用负向前瞻(?!...)和后视来检查上下文(?<!...).
你可以想象,一旦你有一个包含一个角色的目标单词,这种技术就会失败,就像example.很难表达"匹配,e如果它没有跟随,x 而不是之前l".
特别是对于动态模式,正如其他人在此处所建议的那样,进行积极搜索然后替换第二遍中不匹配的每个字符要容易得多.