在Android上使用前瞻性前瞻的正则表达式模式语法错误

时间:2011-12-19 09:11:26

标签: java android regex

我有一个Android应用程序,我正在尝试解析来自服务器的小型XML响应。我只是使用正则表达式来做这件事,但现在我遇到了处理可选XML标记的问题,这些标记可能存在于响应的有效负载中,也可能不存在。我的正则表达式被声明为

final String regex = "^(?=.*<x>(.+)</x>)(?=.*<r>(.+)</r>)?(?=.*<e>(.+)</e>)" +
            "(?=.*<h>(.+)</h>)(?=.*<y>(.+)</y>)(?=.*<n>(.+)</n>).*$";

注意第二个前瞻组之后的问号是否具有&lt; r>标签是可选的。使用Pattern.compile进行编译时,它会导致异常:

Pattern p = Pattern.compile(regex);
...
12-19 10:19:21.257: E/AndroidRuntime(2342): Caused by: java.util.regex.PatternSyntaxException: Syntax error U_REGEX_RULE_SYNTAX near index 36:
12-19 10:19:21.257: E/AndroidRuntime(2342): ^(?=.*<x>(.+)</x>)(?=.*<r>(.+)</r>)?(?=.*<e>(.+)</e>)(?=.*<h>(.+)</h>)(?=.*<y>(.+)</y>)(?=.*<n>(.+)</n>).*$
12-19 10:19:21.257: E/AndroidRuntime(2342):                                     ^
12-19 10:19:21.257: E/AndroidRuntime(2342):     at java.util.regex.Pattern.compileImpl(Native Method)
12-19 10:19:21.257: E/AndroidRuntime(2342):     at java.util.regex.Pattern.compile(Pattern.java:400)
12-19 10:19:21.257: E/AndroidRuntime(2342):     at java.util.regex.Pattern.<init>(Pattern.java:383)
12-19 10:19:21.257: E/AndroidRuntime(2342):     at java.util.regex.Pattern.compile(Pattern.java:374)

没有?-quantifier,它编译得很好。

我也尝试在Windows上使用与桌面java(jdk 1.6.0_24)相同的模式,它可以正常工作(甚至可以正确解析我的测试负载)。 Android上的本机正则表达式实现是否有一些已知的限制,或者我在这里遗漏了一些东西?我已经阅读了Android documentation regarding Pattern,但无济于事。任何帮助将不胜感激,我不想使用专用的XML解析器来做这么简单的事情。

1 个答案:

答案 0 :(得分:1)

通过附加?,您通常无法选择前瞻。这是一些正则表达式方言中的语法错误(因为前瞻断言与?可量化的任何内容都不匹配)。

但是你可以将前瞻包装在一个可选的非捕获组中:

final String regex = "^(?=.*<x>(.+)</x>)(?:(?=.*<r>(.+)</r>))?(?=.*<e>(.+)</e>)" +
            "(?=.*<h>(.+)</h>)(?=.*<y>(.+)</y>)(?=.*<n>(.+)</n>).*$";