Java替换所有(replaceAll)非法重复

3

我有一个存储在字符串中的大型Json。 我想要更改字符串的某些部分,但出现了以下错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 6 "date":{"nil":"true"} ^ at java.util.regex.Pattern.error(Pattern.java:1924) at java.util.regex.Pattern.closure(Pattern.java:3104) at java.util.regex.Pattern.sequence(Pattern.java:2101) at java.util.regex.Pattern.expr(Pattern.java:1964) at java.util.regex.Pattern.compile(Pattern.java:1665) at java.util.regex.Pattern.(Pattern.java:1337) at java.util.regex.Pattern.compile(Pattern.java:1022) at java.lang.String.replaceAll(String.java:2162) at basari.process.MsisdnProcess.setAllPropTypes(MsisdnProcess.java:51) at testClass.MainTest.main(MainTest.java:98)

我的代码:

String example =  "deviceInfo":{"deviceBrand":"NOKIA","imei":"11111111","deviceModel":"6300","date":{"nil":"true"}}

example.replaceAll( "\"date\":{\"nil\":\"true\"}", "\"date\":\"2014-08-14T10:00:00.000+02:00\"");

1
最好能够给出解释为什么正则表达式无效,而不仅仅提供解决方法。 - Denys Séguret
使用replace()函数进行了操作。 - hurricane
需要注意的是,其他一些正则表达式引擎对 {"nil":"true"} 没有任何问题,因为它不包含任何数字,所以它们不会将其视为量词。这是 Java 正则表达式解析器的一个...特性...。 - Denys Séguret
3个回答

4
您可能需要使用String#replace,而不是replaceAll(它使用正则表达式)。
您会遇到此异常是因为在正则表达式中,{...}是一个量词。 例如:
  • {1,3} = 重复1至3次
  • {3,} = 重复3次或更多
  • {3} = 恰好重复3次

虽然它是过载的,OP 可能没有注意到,但你应该链接到 (CharSequence, CharSequence) 版本的方法,而不是 (char, char),因为 OP 正在使用 String - ajp15243
@ajp15243 谢谢,我没看到那个错误。 - August

4
作为异常所示,它试图将其解析为正则表达式而不是纯文本。如果您只想用另一个字符串替换某个字符串,请使用replace()而不是replaceAll()
至于为什么会出现这种特定的异常: { }字符具有特定含义,用于指示重复(也称为某个正则表达式出现的次数)。在实际的正则表达式中,这应该采用整数值,但您的字符串没有提供此值。

4

{} 符号在正则表达式中具有特殊含义,您需要使用额外的反斜杠进行转义。

示例:

example.replaceAll( "\"date\":\\{\"nil\":\"true\"\\}",
        "\"date\":\"2014-08-14T10:00:00.000+02:00\""));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接