#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() );
Комментариев нет:
Отправить комментарий