【已解决】android中的regex出错:java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index

【问题】

之前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:

((?[_a-zA-Z]\w*)(?!\())|(?"[^"]+?")

【解决过程】

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

*+

Zero or more (possessive).

?+

Zero or one (possessive).

++

One or more (possessive).

{n}+

Exactly n (possessive).

{n,}+

At least n (possessive).

{n,m}+

At least n but not more than m (possessive).

 

【总结】

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

的正则的。

另外,写正则,还是要小心,不要误写了。。。。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量