PatternSyntaxException: répétition illégale lors de l’utilisation de regex en Java

Je ne connais pas beaucoup de regex, mais je dois faire correspondre un modèle simple. Ce qui suit devrait retourner true,

Pattern.matches("{\"user_id\" : [0-9]*}", inputLine) 

quand inputLine est

 {"user_id" : 34} 

Cependant, je reçois cette exception:

 java.util.regex.PatternSyntaxException: Illegal repetition {"user_id" : 24} at java.util.regex.Pattern.error(Unknown Source) at java.util.regex.Pattern.closure(Unknown Source) at java.util.regex.Pattern.sequence(Unknown Source) at java.util.regex.Pattern.expr(Unknown Source) at java.util.regex.Pattern.comstack(Unknown Source) at java.util.regex.Pattern.(Unknown Source) at java.util.regex.Pattern.comstack(Unknown Source) at java.util.regex.Pattern.matches(Unknown Source) at org.whispercomm.manes.server.http.IntegrationTest.createUser(IntegrationTest.java:173) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Qu’est-ce que je fais mal?

Les { et } sont spéciaux dans le dialecte de regex de Java (et dans la plupart des autres dialectes): ce sont les jetons d’ouverture et de fermeture du quantificateur de répétition {n,m}n et m sont des entiers. D’où le message d’erreur: “Répétition illégale”.

Vous devriez leur échapper: "\\{\"user_id\" : [0-9]*\\}" .

Et comme vous semblez essayer d’parsingr JSON, je vous suggère de jeter un coup d’oeil à Jackson .

Il devrait y avoir opérateur plus:

 user_id : [0-9]+ 

Double apostrophes uniquement lorsque la chaîne doit le contenir.

Lorsque la chaîne comprenant des accolades utilise:

 \{user_id : [0-9]+\}