2016-07-14 2 views
3

Я использую Apache POI в двух различных проектахPatternSyntaxException с помощью Apache POI

Первый проект представляет собой автономный Java приложения. Здесь все прекрасно.

Второй проект - проект Android. Я могу получить доступ к рабочей книги из XLSX просто отлично, но когда дело доходит до оценки формул, она падает с Exception

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

использовать 'окончательного Pattern nonAlphabeticPattern = Pattern.compile ("\\ Р {L}");' –

+0

Не '\\ P { IsL} 'совершенно законный образец? Согласно Oracle, это «Категории могут быть указаны с дополнительным префиксом Is: Both \ 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. '\ p {prop}' соответствует, если вход имеет свойство prop, а '\ P {prop}' не совпадает, если вход имеет это свойство. * –

ответ

2

Android использует библиотеку регулярных выражений ICU, немного отличающуюся от Java regex engine.

См this reference:

Unicode скрипты, блоки, категории и бинарные свойства записываются с \p и \P конструкций, как в Perl. \p{prop} соответствует, если вход имеет свойство prop, а \P{prop} не совпадает, если вход имеет это свойство.

Таким образом, шаблон должен быть записан в виде

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

Спасибо. Мне удалось это сделать. Я перекомпилировал источники apache poi и заменил банку для моего проекта. Et voilà – devnull69

+2

В ящике POI мы теперь перезаписали функцию PROPER, чтобы вообще не использовать регулярные выражения, а также зафиксировали несколько случаев, когда метод вел себя неправильно, например. на некоторых акцентированных символах, см. https://github.com/apache/poi/commit/aec95a44918e5331f0d3a746202c713bc8ac6aad – centic