Функция возвращает строку данного вида, и с помощью регулярного выражения я ее привожу к нужному виду, в 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.
если меняю интервал с {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} (с потерей производительности, видимо)
Сделать пирамидку из (.|..|...|....) и т.п.
Комментариев нет:
Отправить комментарий