2016-07-14 19 views
3

Ich bin mit Apache POI in zwei verschiedenen ProjektenPattern mit Apache poi

Das erste Projekt ist eine eigenständige Java-Anwendung. Alles ist gut hier.

Das zweite Projekt ist ein Android-Projekt. Ich kann die Arbeitsmappe eines xlsx zugreifen ganz gut, aber wenn es Formeln zur Bewertung kommt, stürzt es mit einer Ausnahme

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) 

Dies ist die betreffende Codezeile ist:

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

Warum Android nicht Akzeptiere das? Wie gesagt: Es funktioniert gut auf einer eigenständigen Java-Anwendung ....

+0

Verwenden 'endgültige Muster geschrieben werden nonAlphabeticPattern = Pattern.compile ("\\ P {L}");' –

+0

Ist das nicht '\\ P { IsL} 'ein vollkommen legales Muster? Laut Oracle ist es möglich, dass Kategorien mit dem optionalen Präfix Is angegeben werden können: Sowohl \ p {L} als auch \ p {IsL} bezeichnen die Kategorie der Unicode-Buchstaben. Wie bei Skripten und Blöcken können auch Kategorien mit dem Schlüsselwort general_category (oder der Kurzform gc) angegeben werden, wie in general_category = Lu oder gc = Lu.' – devnull69

+1

Android verwendet die ICU-Regex-Bibliothek, Java hat einen eigenen ICU-basierten Regex . Siehe [* this *] (https://developer.android.com/reference/java/util/regex/Pattern.html#gnumber): * Unicode-Skripte, Blöcke, Kategorien und binäre Eigenschaften werden mit dem '\ p' geschrieben und '\ P' konstruiert wie in Perl. '\ p {prop}' stimmt überein, wenn die Eingabe die Eigenschaft prop hat, während '\ P {prop}' nicht übereinstimmt, wenn die Eingabe diese Eigenschaft hat. * –

Antwort

2

Android verwendet ICU Regex-Bibliothek, die ein bisschen anders als Java Regex-Engine ist.

Siehe this reference:

Unicode-Skripte, Blöcke, Kategorien und binäre Eigenschaften sind geschrieben mit den \p und \P Konstrukten wie in Perl. \p{prop} stimmt überein, wenn die Eingabe die Eigenschaft prop hat, während \P{prop} nicht übereinstimmt, wenn die Eingabe diese Eigenschaft hat.

Somit sollte das Muster als

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

Danke. Ich habe es geschafft. Ich habe die Apache Poi Quellen neu kompiliert und das Glas für mein Projekt ersetzt. Et voilà – devnull69

+2

In POI-Stamm haben wir jetzt die PROPER-Funktion neu geschrieben, um überhaupt keine regulären Ausdrücke zu verwenden, und auch einige Fälle behoben, in denen sich die Methode falsch verhalten hat, z. Einige Zeichen mit Akzenten finden Sie unter https://github.com/apache/poi/commit/aec95a44918e5331f0d3a746202c713bc8ac6aad – centic