【问题标题】:Regex pattern error in Android when matching closing brace匹配右大括号时Android中的正则表达式模式错误
【发布时间】:2017-07-13 08:02:39
【问题描述】:

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

if(Pattern.matches("\\{\\{.*?}}", element.getValue())) {
   ...             
} else {
   ...
}

我收到以下错误。

 Caused by: java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 8
                                                                  \{\{.*?}}

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

System.out.println(Pattern.matches("\\{\\{.*?}}", "{{hello:sdf}}"));

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

【问题讨论】:

  • 我认为你只需要使用if (element.getValue().matches("\\{\\{.*?}}")),如果你还有问题,也可以尝试转义}s。
  • 我注意到 pre api 版本 21 java.util.regex 匹配器无法正常工作。最好还是使用com.google.code.regexp

标签: java android regex


【解决方案1】:

使用

"\\{\\{.*?\\}\\}"

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

在绝大多数正则表达式风格中,} 不必转义,但 ICU 正则表达式引擎并非如此,它无法根据模式上下文推断出 } 的含义。例如。 PCRE、.NET、Python、Java 正则表达式在[a-z]} 模式中找到},因为之前没有{,他们“知道”它不是limiting quantifier construct 的一部分。 ICU没那么聪明。它仍然认为必须有一个{,在}之前跟一个数字,如果未转义则报告错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多