JSON格式内的字符串匹配

时间:2014-01-26 08:27:59

标签: java regex json

我正在使用一个简单的正则表达式匹配器来匹配wikidump中的一段JSON文本。 JSON在XML中。我在字符串<text>中检索了XML标记str的内容。 代码是

str.matches(".*&quot;m&quot;:[&quot;value&quot;,569,&quot;time&quot;,\\{&quot;time&quot;:&quot;+00000001952-03-11.*")

(我在标签<text>里面给出了确切的格式)

{存在问题,因此我加入了\\{,仍然无效。我对那里的{并不感到困扰,但我不知道怎么逃避它。

错误是:

  

java.util.regex.PatternSyntaxException:附近有非法的字符范围   指数94    “M”:[ “值”,569, “时间”,{ “时间”:“+ 00000001952-03-11   ^在java.util.regex.Pattern.error(Pattern.java:1924)at   java.util.regex.Pattern.range(Pattern.java:2594)at   java.util.regex.Pattern.clazz(Pattern.java:2507)at   java.util.regex.Pattern.sequence(Pattern.java:2030)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.util.regex.Pattern.matches(Pattern.java:1128)at   java.lang.String.matches(String.java:2063)at   testProjectone.birthDate.testbirthDate(birthDate.java:64)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47)     在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)     在   org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)     在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)at   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)     在   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)     在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:309)at at   org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)     在   org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)     在   org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

2 个答案:

答案 0 :(得分:0)

你提到的方法电话

str.matches("."m":["value",569,"time",\{"time":"+00000001952-03-11."

是个问题。方法参数中双引号内的双引号是个问题。

答案 1 :(得分:0)

您需要转义[,因为它会被引擎解释为字符类[]的开头。

您需要转义的另一件事是+中的+0000000,因为+被解释为重复前一个字符(;)一次或多次。

".*&quot;m&quot;:\\[&quot;value&quot;,569,&quot;time&quot;,\\{&quot;time&quot;:&quot;\\+00000001952-03-11.*"

当您想要找到一个长固定字符串时构建正则表达式的一种简单方法是使用Pattern.quote(String s)

".*" + Pattern.quote("&quot;m&quot;:[&quot;value&quot;,569,&quot;time&quot;,{&quot;time&quot;:&quot;+00000001952-03-11") + ".*"

.*之间的文字部分将全部视为文字字符。