为什么Pattern.compile在android studio和Java SE中的行为不同?
我需要匹配任意字符串中的hashmap。模式是为什么Pattern.compile在android studio和Java SE中的行为不同?,java,android,regex,Java,Android,Regex,我需要匹配任意字符串中的hashmap。模式是*(“账户[^}]*?})。* 在中编译为时会引发错误: 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 er
*(“账户[^}]*?})。*
在中编译为时会引发错误:
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)
作为代码:
。。。
私有静态最终字符串模式\u ACCOUNTS=“.*(\”ACCOUNTS[^}]*?})。*”;
...
Pattern regex=Pattern.compile(Pattern\u账户);
Matcher matches=regex.Matcher(loginResponse);
if(匹配.find()){
accounts=g.fromJson(匹配.group(1),accounts.getClass());
}
归还账户;
...
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中成功编译,但在JavaSE中却可以?我做错什么了吗?如果你摆脱了大括号,它会起作用吗
private静态最终字符串模式\u ACCOUNTS=“.*(\”ACCOUNTS[^}]*?\})。*”;
Android使用与JavaSE不同的正则表达式引擎,JavaSE需要引用大括号进行文本匹配
更多信息:尽管它可能很奇特,但它确实奏效了。谢谢!
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));
}
}