2016-07-14 118 views
3

我在两个不同的项目中使用Apache POIPatternSyntaxException使用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应用程序上工作正常......

+0

使用'最终图案nonAlphabeticPattern = Pattern.compile( “\\ p {L}”);' –

+0

不是'\\ p { IsL}是一个完全合法的模式吗?根据Oracle的说法,它是'可以用可选的前缀Is来指定类别:\ p {L}和\ p {IsL}表示Unicode字母的类别。与脚本和块相同,也可以使用关键字general_category(或其简写形式gc)指定类别,如general_category = Lu或gc = Lu.' – devnull69

+1

Android正在使用ICU正则表达式库,Java具有自己的基于ICU的正则表达式。请参阅[* this *](https://developer.android.com/reference/java/util/regex/Pattern.html#gnumber):* Unicode脚本,块,类别和二进制属性用'\ p'和'\ P'构造如Perl。如果输入具有属性prop,则'\ p {prop}'匹配,而如果输入具有该属性,则'\ P {prop}'不匹配。“# –

回答

2

Android正在使用ICU正则表达式库,它与Java正则表达式引擎有点不同。

参见this reference

Unicode的脚本,块,类别和二进制属性与\p\P构建写为在Perl。如果输入具有属性prop,则\p{prop}匹配,而如果输入具有该属性,则\P{prop}不匹配。

因此,图案应写为

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

谢谢。我设法做到了。我重新编译了apache poi源文件,并替换了我的项目的jar文件。 Etvoilà – devnull69

+2

在POI主干中,我们现在已经重写了PROPER函数,以便根本不使用正则表达式,并修正了某些方法确实表现不正确的情况,例如,在一些重音字符上,请参阅https://github.com/apache/poi/commit/aec95a44918e5331f0d3a746202c713bc8ac6aad – centic