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

97

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

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

lorsque inputLine est

{"user_id" : 34}

Cependant, j'obtiens 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.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(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?

gsingh2011
la source

Réponses:

170

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

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

Et puisque vous semblez essayer d'analyser JSON, je vous suggère de jeter un œil à Jackson .

fge
la source
6
En remarque, les crochets [ ]sont également réservés. stackoverflow.com/questions/14442162/…
user2601995
7

Il devrait y avoir un opérateur plus:

user_id : [0-9]+

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

Lorsque la chaîne comprenant des accolades utilise:

\{user_id : [0-9]+\}
Jirka Kopřiva
la source
2
La réponse est que j'avais besoin d'échapper au {}. Cependant, j'avais besoin d'un +au lieu d'un*
gsingh2011