我有一个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解析器来做这么简单的事情。
答案 0 :(得分:1)
通过附加?
,您通常无法选择前瞻。这是一些正则表达式方言中的语法错误(因为前瞻断言与?
可量化的任何内容都不匹配)。
但是你可以将前瞻包装在一个可选的非捕获组中:
final String regex = "^(?=.*<x>(.+)</x>)(?:(?=.*<r>(.+)</r>))?(?=.*<e>(.+)</e>)" +
"(?=.*<h>(.+)</h>)(?=.*<y>(.+)</y>)(?=.*<n>(.+)</n>).*$";