Страницы

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

суббота, 8 февраля 2020 г.

PatternSyntaxException

#java #android #регулярные_выражения #android_studio #netbeans


Функция возвращает строку данного вида, и с помощью регулярного выражения я ее привожу
к нужному виду, в NetBeans код работает без проблем, но в Android Studio такая ошибка,
в чем может быть проблема?

String s = "№;Задача;T;O;P\n"
+ ";2016-01-18\n"
+ "1. ;task1;03:00;.; \n"
+ ";2016-01-18\n"
+ "2. ;task2;03:00;.; \n"
+ ";2016-01-18\n"
+ "3. ;task3;03:00;.; \n"
+ ";2016-01-19\n"
+ "7. ;33333;03:00;.; \n"
+ ";2016-01-19\n"
+ "8. ;d;03:00;.; \n"
+ ";2016-01-19\n"
+ "9. ;00;03:00;.; \n"
+ ";2016-01-20\n"
+ "21. ;task1;03:00;.; \n"
+ ";2016-01-20\n"
+ "22. ;task2;03:00;.; \n"
+ ";2016-01-21\n"
+ "25. ;testtime;03:00;.; \n"
+ ";2016-01-21\n"
+ "26. ;fgghgfh;23:45;.;, new t.\n";

String regex = "(?<=(;\\d{4}-\\d\\d-\\d\\d\n).{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}, то ошибка пропадает, но тогда не срабатывает
регулярное выражение
    


Ответы

Ответ 1



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

Ответ 2



Решил проблему по другому вот тут объяснение StringTokenizer tok = new StringTokenizer( s, "\n" ); StringBuilder newString = new StringBuilder( s.length()*2/3 ); String prevDate = ""; newString.append( tok.nextToken() ).append( '\n' ); // заголовок while( tok.hasMoreTokens() ) { String date = tok.nextToken(); // дата if ( !prevDate.equals( date ) ) { prevDate = date; newString.append( prevDate ).append( '\n' ); } newString.append( tok.nextToken() ).append( '\n' ); // данные } System.out.println( newString.toString() );

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

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