Выражаемся регулярно

Регулярные выражения прочно вошли в обиход программистов. Однако если вы собираетесь решать свою проблему с помощью регулярных выражений, то к первоначальной проблеме сразу прибавляется еще одна — сами регулярные выражения.

В докладе мы разберемся с тем, что делать, если регулярное выражение работает 30 секунд на строке в 50'000 символов? Как предотвратить StackOverflowError из RegExp'а на стадии code review? Например, мы разберемся почему в коде ниже:

String schedule;
StringBuilder sb = new StringBuilder();
for (int count = 1; count <= 2015; count++) {
    sb.append("JokerJPoint");
}
schedule = sb.toString();
boolean nirvana = schedule.matches("(Joker|JPoint)*");

Может произойти вот такая ошибка:

java.lang.StackOverflowError
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
at java.util.regex.Pattern$Slice.match(Pattern.java:3972)
at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
at java.util.regex.Pattern$Slice.match(Pattern.java:3972)
at java.util.regex.Pattern$Branch.match(Pattern.java:4604)

Мы также научимся обходить узкие места стандартной библиотеки java.util.regex, рассмотрим альтернативные реализации, и научимся с первого взгляда отличать плохое выражение от хорошего.

Не останутся без ответа и вопросы из серии RegExp vs. XPath:

  • Стоит ли парcить xml и использовать xpath, если нужно выбрать всего одно простое поле? А если 2 или 5?
  • RegExp vs. SQL: Мы кратко пройдемся по некоторым проблемам с регулярными выражениями в других языках (например, SQL, Python).
Владимир Ситников, NetCracker

@VladimirSitnikv

8 лет работает над производительностью и масштабируемостью NetCracker OSS. Увлекается производительностью Java, Oracle Database. Воспитывает дочь и в свободное время занимается бальными танцами.