java正则表达式如何匹配不是某个子字符串的字符串

java正则表达式如何匹配不是某个子字符串的字符串,java,regex,Java,Regex,例如,我的组织字符串是: CCC=123 CCC=DDDDD CCC=EE CCC=123 CCC=FFFF 我希望所有不等于“CCC=123”的内容都改为“CCC=AAA” 因此,结果是: CCC=123 CCC=AAA CCC=AAA CCC=123 CCC=AAA 如何在正则表达式中执行它 如果我希望将所有等于“CCC=123”的内容都更改为“CCC=AAA”,则很容易实现: (AAA[\t]*=)(123)您可以使用负前瞻: public static void main(Strin

例如,我的组织字符串是:

CCC=123
CCC=DDDDD
CCC=EE
CCC=123
CCC=FFFF
我希望所有不等于“CCC=123”的内容都改为“CCC=AAA”

因此,结果是:

CCC=123
CCC=AAA
CCC=AAA
CCC=123
CCC=AAA
如何在正则表达式中执行它

如果我希望将所有等于“CCC=123”的内容都更改为“CCC=AAA”,则很容易实现:


(AAA[\t]*=)(123)

您可以使用负前瞻:

public static void main(String[] args) 
{

    String foo = "CCC=123 CCC=DDD CCC=EEE";
    Pattern p = Pattern.compile("(CCC=(?!123).{3})");
    Matcher m = p.matcher(foo);
    String result = m.replaceAll("CCC=AAA");

    System.out.println(result);

}
输出:

CCC=123 CCC=AAA CCC=AAA

这些是零宽度的非捕获字符,这就是为什么必须添加
{3}
来捕获要替换的非匹配字符

s = s.replaceAll("(?m)^CCC=(?!123$).*$", "CCC=AAA");

(?m)
激活多行模式,该模式允许
^
$
分别匹配行首和行尾。前瞻中的
$
确保您不会跳过仅部分匹配的内容,例如
CCC=12345
。最后的
$
其实没有必要,因为
*
在任何情况下都会占用剩下的部分,但它有助于传达你的意图。

你能告诉我。{3}是什么意思吗?
表示任何字符,
{3}
表示其中三个字符。呃,然后,您需要更改该部分以匹配不是
123
的任何部分。负向前看告诉您
CCC=
后面的三个字符不是
123
。因为你想做一个替换,你需要提供一个正则表达式来匹配任何匹配项<代码>(CCC=(?!123)[^\n]+)会起作用。它似乎也能起作用。你能告诉我(CCC=(!123$)[^\n]*)和(CCC=(!123$)*)在大多数正则表达式中的区别是什么吗?它们是相同的<代码>匹配除换行符以外的任何单个字符(
\n
)。然而,Java比大多数口味更聪明。输入中的行可以用
\n
\r\n
\u2028
分隔,并且
^.*$
仍将正确匹配它们。