匹配右括号时Android中的正则表达式模式错误

cha*_*ghe 4 java regex android

我正在使用java.util.regex.Pattern类来匹配Android程序中的字符串。

if(Pattern.matches("\\{\\{.*?}}", element.getValue())) {
   ...             
} else {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下错误。

 Caused by: java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 8
                                                                  \{\{.*?}}
Run Code Online (Sandbox Code Playgroud)

我正在使用Android Studio和Open JDK。为了测试正则表达式,我在Netbeans中编写了一个简单程序,它工作正常。Netbeans也使用openjdk。

System.out.println(Pattern.matches("\\{\\{.*?}}", "{{hello:sdf}}"));
Run Code Online (Sandbox Code Playgroud)

为什么正则表达式在android项目中给出错误?

Wik*_*żew 7

使用

"\\{\\{.*?\\}\\}"
Run Code Online (Sandbox Code Playgroud)

问题是,在Android中使用的正则表达式引擎是ICU的发动机是从Java一个不同的,并且 {}代表字面打开/关闭大括号必须ICU正则表达式模式进行转义。

在绝大多数}情况下,不必逃避正则表达式的味道,但ICU regex引擎并非如此,它不能}基于模式上下文来推断含义。例如PCRE,.NET,Python,Java正则表达式会}[a-z]}模式查找,并且像{以前一样,它们“知道”它不是限制量词构造的一部分。ICU不是那么聪明。它仍然认为必须在{其后跟一个数字},如果未转义,则报告错误。