我正在尝试为以下内容创建一个正则表达式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));
}
当我尝试用以下内容替换模式时+
没有问题 -abXYabcXYZ
有图案(abc)
回报abxy+xyz
。图案(^(abc))
返回不进行替换的字符串。
还有其他方法可以将 NOT(regex) 或组符号写为单词吗?
使用正则表达式想要实现的目标非常困难,因为无法表达“替换与模式不匹配的字符串”。您必须使用“积极”模式,告诉要匹配什么而不是不匹配什么。
此外,您想替换每个角色带有替换字符,因此您必须确保您的模式与一个字符完全匹配。否则,您将用单个字符替换整个字符串,返回较短的字符串。
对于您的玩具示例,您可以使用负向前查找和向后查找来完成任务,但这对于具有更长或更复杂字符串的实际示例来说可能更困难,因为您必须单独考虑字符串的每个字符,以及它的背景。
这是“not ‘abc’”的模式:
[^abc]|a(?!bc)|(?<!a)b|b(?!c)|(?<!ab)c
它由五个子模式组成,通过“或”连接(|
),每个都恰好匹配一个字符:
-
[^abc]
匹配除以下字符外的所有字符a
, b
or c
-
a(?!bc)
火柴a
如果后面没有bc
-
(?<!a)b
火柴b
如果前面没有a
-
b(?!c)
火柴b
如果后面没有c
-
(?<!ab)c
火柴c
如果前面没有ab
这个想法是匹配目标单词中不存在的每个字符abc
,加上根据上下文,不属于单词一部分的每个单词字符。可以使用否定前瞻来检查上下文(?!...)
和回顾(?<!...)
.
您可以想象,一旦您的目标单词多次包含一个字符,这种技术就会失败,例如example
。很难表达“匹配”e
如果后面没有x
and之前没有l
”.
特别是对于动态模式,进行积极搜索然后替换第二遍中不匹配的每个字符要容易得多,正如其他人在这里建议的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)