Страницы

Поиск по вопросам

пятница, 12 апреля 2019 г.

PatternSyntaxException

Функция возвращает строку данного вида, и с помощью регулярного выражения я ее привожу к нужному виду, в NetBeans код работает без проблем, но в Android Studio такая ошибка, в чем может быть проблема?
String s = "№;Задача;T;O;P
" + ";2016-01-18
" + "1. ;task1;03:00;.;
" + ";2016-01-18
" + "2. ;task2;03:00;.;
" + ";2016-01-18
" + "3. ;task3;03:00;.;
" + ";2016-01-19
" + "7. ;33333;03:00;.;
" + ";2016-01-19
" + "8. ;d;03:00;.;
" + ";2016-01-19
" + "9. ;00;03:00;.;
" + ";2016-01-20
" + "21. ;task1;03:00;.;
" + ";2016-01-20
" + "22. ;task2;03:00;.;
" + ";2016-01-21
" + "25. ;testtime;03:00;.;
" + ";2016-01-21
" + "26. ;fgghgfh;23:45;.;, new t.
";
String regex = "(?<=(;\\d{4}-\\d\\d-\\d\\d
).{0,30})\\1"; String result = Pattern.compile(regex, Pattern.DOTALL).matcher(s).replaceAll("");
System.out.println( result );
вот ошибка
01-22 00:51:10.072 12001-12001/com.jaloveast1k.topbook E/AndroidRuntime: FATAL EXCEPTION: main Process: com.jaloveast1k.topbook, PID: 12001 java.util.regex.PatternSyntaxException: Look-behind pattern matches must have a bounded maximum length near index 9: (?<=(;\d{4}-\d\d-\d\d ).{0,30})\1 ^ at java.util.regex.Pattern.compileImpl(Native Method) at java.util.regex.Pattern.compile(Pattern.java:411) at java.util.regex.Pattern.(Pattern.java:394) at java.util.regex.Pattern.compile(Pattern.java:374) at com.jaloveast1k.topbook.MainActivity.sendTasks(MainActivity.java:1669) at com.jaloveast1k.topbook.MainActivity.send(MainActivity.java:1600) at com.jaloveast1k.topbook.MainActivity.access$700(MainActivity.java:51) at com.jaloveast1k.topbook.MainActivity$9.onClick(MainActivity.java:224) at android.view.View.performClick(View.java:4438) at android.view.View$PerformClick.run(View.java:18422) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method)
если меняю интервал с {0,30} на {0,9}, то ошибка пропадает, но тогда не срабатывает регулярное выражение


Ответ

Почему так:
Это баг в ICU (#40103 в AOSP, #10024 в ICU trac, изменения), поправлен в ICU 52, до андроида исправление добралось только вместе с ICU 53 в API 21 (Lollipop).
Баг не позволяет использовать квантификаторы с большой верхней границей внутри look-behind (конструкция .{0,10} у меня на эмуляторе проблем не вызывает, но я слишком слабо понимаю код ICU, чтобы объяснить, почему).
Что делать:
Переписать регулярное выражение Не использовать регулярное выражение. Заменить .{0,30} на три .{0,10} (с потерей производительности, видимо) Сделать пирамидку из (.|..|...|....) и т.п.

Комментариев нет:

Отправить комментарий