【问题】
之前android中,写了个正则regex:
Pattern idP = Pattern.compile("((?[_a-zA-Z]\\w*+)(?!\\())|(?\"[^\"]+?\")");
结果现在,正则compile时,就出错了:
[5:19:34 PM] Sam Wu: java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 4: |
【解决过程】
1.调试了半天,最后发现,是原来对应:
(?:xxx)
修改去掉冒号的时候,忘了去掉问号,所以变成了:
(?xxx)
所以出错了。
2.最后改为:
//Pattern idP = Pattern.compile("((?[_a-zA-Z]\\w*+)(?!\\())|(?\"[^\"]+?\")"); //Pattern idP = Pattern.compile("((?[_a-zA-Z]\\w*)(?!\\())|(?\"[^\"]+?\")"); //Pattern idP = Pattern.compile("((?[_a-zA-Z]\\w*)(?!\\())|(?\"[^\"]+?\")"); //Pattern idP = Pattern.compile("(?[_a-zA-Z]\\w*)|(?\"[^\"]+?\")"); //Pattern idP = Pattern.compile("([a-zA-Z_]\\w*)|(\"[^\"]+?\")"); Pattern idP = Pattern.compile("(([a-zA-Z_]\\w*)(?!\\())|(\"[^\"]+?\")");
就可以了。
但是发现,对于:
{N, units_code(N)} |
会把:
units_code(
分成两部分:
units_cod
e(
前面的
units_cod
可以捕获到。后面的
e(
可以扔掉。
但是很明显不是此处所需要的。
3.后来改为:
Pattern idP = Pattern.compile("(([a-zA-Z_]\\w*+)(?!\\())|(\"[^\"]+?\")");
就可以,正常的:
发现units_code后面又左括号(,然后可以扔掉,
只捕获到两个ID,即字母N。
其中此处的:
*+
表示尽可能多的意思:
语法详见:
https://developer.android.com/reference/java/util/regex/Pattern.html
|
【总结】
android中的正则,其实,正常的话,是和java中类似的。
比如android api level 17:
https://developer.android.com/reference/java/util/regex/Pattern.html
的话,应该是对应着java 6中:
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
的正则的。
另外,写正则,还是要小心,不要误写了。。。。
转载请注明:在路上 » 【已解决】android中的regex出错:java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index