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

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

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

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

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

Чтобы проверить, имеет ли ввод значение FASTA

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

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

Спасибо,

Мартин

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

Ответы [ 3 ]

1 голос
/ 28 июня 2010

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

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

1 голос
/ 27 июня 2010

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

Другая вещь - это использование групп регулярных выражений без захвата, если вам не нужен результат сопоставления.

0 голосов
/ 27 июня 2010

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

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

...