PatternSyntaxException: Lặp lại bất hợp pháp khi sử dụng regex trong Java


97

Tôi không biết nhiều regex, nhưng tôi cần phải phù hợp với một mẫu đơn giản. Giá trị sau sẽ trả về true,

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

khi inputLine là

{"user_id" : 34}

Tuy nhiên, tôi nhận được ngoại lệ này:

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)

Tôi đang làm gì sai?

Câu trả lời:


170

Các {}là đặc biệt trong phương ngữ regex Java (và hầu hết các phương ngữ khác cho rằng vấn đề): họ là những thẻ đóng mở và cho phép lượng hóa lặp lại {n,m}nơi nmlà số nguyên. Do đó thông báo lỗi: "Lặp lại bất hợp pháp".

Bạn nên thoát khỏi chúng: "\\{\"user_id\" : [0-9]*\\}".

Và vì bạn dường như đang cố gắng phân tích cú pháp JSON, tôi khuyên bạn nên xem Jackson .


6
Lưu ý thêm, dấu ngoặc [ ]cũng được đặt trước. stackoverflow.com/questions/14442162/…
user2601995

7

Phải có toán tử cộng:

user_id : [0-9]+

Dấu nháy đơn kép chỉ khi chuỗi phải chứa nó.

Khi chuỗi bao gồm dấu ngoặc nhọn sử dụng:

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

2
Câu trả lời là tôi cần phải thoát khỏi {}. Tuy nhiên, tôi đã cần +thay vì a*
gsingh2011
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.