Почему эти регулярные выражения медленно выполняются в Java?

Я пытаюсь использовать регулярные выражения для определения, какой формат пользователь применил когда вход ввода в текстовом поле.
Регулярные выражения следующие:

(\\s?[" + alphabet + "]{9,9})+

Определить, является ли вход одной или несколькими строками длины 9 в данном алфавите, возможно разделенном пробелом.

(>[\\w\\s]+\\n[" + alphabet + "\\s]+)+

Проверять, находится ли вход в формате FASTA

Регулярные выражения, выполненные ужасно медленный при соответствии inputString.matches(regexString). Почему это?

Я полагал, что это может произойти из-за Java, хранящего все потенциальные соответствия (в котором я не нуждаюсь в этой точке), но добавление ?: в каждой круглой скобке повреждает regex. Как это должно быть сделано?

Спасибо,

Martin

Редактирование 1: Я не мог воспроизвести эту проблему - это только происходит на одном компьютере. Это могло предложить что-то не так с той конкретной установкой VM.
Нам нужно что-то более устойчивое, и таким образом, мы будем реализовывать это по-другому. Я выбрал ответ Joel как правильный, так как я полагаю, что некоторый особый случай в Шаблоне может быть причиной.

6
задан Martin Wiboe 27 June 2010 в 17:21
поделиться

3 ответа

Если у вас есть несколько различных шаблонов регулярных выражений, которые сопоставляются с одним и тем же вводом, чтобы попытаться классифицировать ввод, то вам, вероятно, лучше использовать генератор лексического анализатора, такой как JFlex.

Другие инструменты лексического анализатора и синтаксического анализатора на базе Java, которые обычно используются при создании компиляторов, можно найти в списке здесь.

0
ответ дан 17 December 2019 в 20:28
поделиться

Возможно, это не объясняет вашу конкретную проблему. но как только я погрузился в реализацию регулярных выражений JDK, я был удивлен, насколько проста . на самом деле он не создает конечный автомат, который продвигается при каждом вводе char. Я полагаю, у них есть свои причины.

В вашем случае очень легко написать синтаксический анализ самостоятельно, вручную. люди боятся этого, кажется «глупым» вручную кодировать эти крошечные шаги, и люди думают, что уже существующие библиотеки должны проделывать какие-то великолепные трюки, чтобы превзойти домашние решения. это не правда. во многих случаях наши потребности довольно просты, и сделать это проще и быстрее.

1
ответ дан 17 December 2019 в 20:28
поделиться

string.matches() компилируйте regex каждый раз, когда вы это делаете. Вместо этого посмотрите на классы Pattern/Matcher, которые позволяют кэшировать предварительно скомпилированные регулярные правила.

Другое дело — использовать группы regex без захвата, если вам не нужен результат сопоставления.

1
ответ дан 17 December 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: