【问题标题】:Why does Pattern.compile behave differently in android studio and Java SE? [duplicate]为什么 Pattern.compile 在 android studio 和 Java SE 中表现不同? [复制]
【发布时间】:2019-05-18 09:43:05
【问题描述】:

我需要匹配任意字符串中的哈希图。模式是.*("accounts[^}]*?}).*

在AS编译时会报错:

05-18 12:06:46.666 4611-4611/com.mlntdrv.mybudgetpulse E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mlntdrv.mybudgetpulse, PID: 4611
    java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 19:
    .*("accounts[^}]*?}).*
                       ^
        at java.util.regex.Pattern.compileImpl(Native Method)
        at java.util.regex.Pattern.compile(Pattern.java:411)
        at java.util.regex.Pattern.<init>(Pattern.java:394)
        at java.util.regex.Pattern.compile(Pattern.java:381)
        at com.mlntdrv.mybudgetpulse.LoginActivity.extractAccountsFromLoginResponse(LoginActivity.java:127)
        at com.mlntdrv.mybudgetpulse.LoginActivity.access$100(LoginActivity.java:27)
        at com.mlntdrv.mybudgetpulse.LoginActivity$1$1.onResponse(LoginActivity.java:71)
        at com.mlntdrv.mybudgetpulse.LoginActivity$1$1.onResponse(LoginActivity.java:58)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
        at android.os.Handler.handleCallback(Handler.java:808)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:5292)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
        at dalvik.system.NativeStart.main(Native Method)

Java SE 中的相同正则表达式:

"C:\Program Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3\lib\idea_rt.jar=63488:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\milan\eclipse-workspace\untitled\out\production\untitled com.company.Main
.*("accounts[^}]*?}).* matches -> "accounts":{"1":"main"}

AS 代码:

...
    private static final String PATTERN_ACCOUNTS = ".*(\"accounts[^}]*?}).*";
...
        Pattern regex = Pattern.compile(PATTERN_ACCOUNTS);
        Matcher matches = regex.matcher(loginResponse);

        if(matches.find()){
            accounts = g.fromJson(matches.group(1), accounts.getClass());
        }

        return accounts;
...

Java SE 代码:

public class Main {
    private static final String PATTERN_ACCOUNTS = ".*(\"accounts[^}]*?}).*";

    public static void main(String[] args) {
    // write your code here
        Pattern regex = Pattern.compile(PATTERN_ACCOUNTS);
        Matcher matches = regex.matcher("blabla, \"accounts\":{\"1\":\"main\"}, blabla");

        if (matches.find()) System.out.println(PATTERN_ACCOUNTS + " matches -> " + matches.group(1));
    }
}

为什么在 AS 编译不成功,在 Java SE 编译成功?我做错了吗?

【问题讨论】:

标签: java android regex


【解决方案1】:

如果你把花括号转义,它会起作用吗?

    private static final String PATTERN_ACCOUNTS = ".*(\"accounts[^}]*?\\}).*";

Android 使用与 Java SE 不同的正则表达式引擎,后者需要用大括号括起来以进行文字匹配。

更多:Regex pattern error in Android

【讨论】:

  • 尽管它可能很奇特......它奏效了。谢谢!
猜你喜欢
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多