使用apache poi的PatternSyntaxException

时间:2016-07-14 13:55:28

标签: java android regex apache-poi

我在两个不同的项目中使用Apache POI

第一个项目是一个独立的Java应用程序。这里一切都很好。

第二个项目是一个Android项目。我可以很好地访问xlsx的工作簿,但是当涉及到评估公式时,它会因异常而崩溃

java.util.regex.PatternSyntaxException: U_ILLEGAL_ARGUMENT_ERROR \P{IsL}
   at java.util.regex.Pattern.compileImpl(Native Method)
   at java.util.regex.Pattern.compile(Pattern.java:411)
   at java.util.regex.Pattern.<init>(Pattern.java:394)
   at java.util.regex.Pattern.compile(Pattern.java:381)
   at org.apache.poi.ss.formula.functions.TextFunction$5.<init>(TextFunction.java:124)
   at org.apache.poi.ss.formula.functions.TextFunction.<clinit>(TextFunction.java:123)

这是有问题的代码行:

    final Pattern nonAlphabeticPattern = Pattern.compile("\\P{IsL}");

为什么Android不接受这个?正如我所说:它在独立的Java应用程序上运行良好......

1 个答案:

答案 0 :(得分:2)

Android正在使用与Java正则表达式引擎略有不同的ICU正则表达式库。

请参阅this reference

  

Unicode脚本,块,类别和二进制属性是使用\p\P结构编写的,如Perl中所示。如果输入具有属性prop,则\p{prop}匹配,而如果输入具有该属性,则\P{prop}不匹配。

因此,模式应写为

Pattern nonAlphabeticPattern = Pattern.compile("\\P{L}");