Я пытаюсь использовать регулярные выражения для определения, какой формат пользователь применил когда вход ввода в текстовом поле.
Регулярные выражения следующие:
(\\s?[" + alphabet + "]{9,9})+
Определить, является ли вход одной или несколькими строками длины 9 в данном алфавите, возможно разделенном пробелом.
(>[\\w\\s]+\\n[" + alphabet + "\\s]+)+
Проверять, находится ли вход в формате FASTA
Регулярные выражения, выполненные ужасно медленный при соответствии inputString.matches(regexString)
. Почему это?
Я полагал, что это может произойти из-за Java, хранящего все потенциальные соответствия (в котором я не нуждаюсь в этой точке), но добавление ?:
в каждой круглой скобке повреждает regex. Как это должно быть сделано?
Спасибо,
Martin
Редактирование 1: Я не мог воспроизвести эту проблему - это только происходит на одном компьютере. Это могло предложить что-то не так с той конкретной установкой VM.
Нам нужно что-то более устойчивое, и таким образом, мы будем реализовывать это по-другому. Я выбрал ответ Joel как правильный, так как я полагаю, что некоторый особый случай в Шаблоне может быть причиной.
Если у вас есть несколько различных шаблонов регулярных выражений, которые сопоставляются с одним и тем же вводом, чтобы попытаться классифицировать ввод, то вам, вероятно, лучше использовать генератор лексического анализатора, такой как JFlex.
Другие инструменты лексического анализатора и синтаксического анализатора на базе Java, которые обычно используются при создании компиляторов, можно найти в списке здесь.
Возможно, это не объясняет вашу конкретную проблему. но как только я погрузился в реализацию регулярных выражений JDK, я был удивлен, насколько проста . на самом деле он не создает конечный автомат, который продвигается при каждом вводе char. Я полагаю, у них есть свои причины.
В вашем случае очень легко написать синтаксический анализ самостоятельно, вручную. люди боятся этого, кажется «глупым» вручную кодировать эти крошечные шаги, и люди думают, что уже существующие библиотеки должны проделывать какие-то великолепные трюки, чтобы превзойти домашние решения. это не правда. во многих случаях наши потребности довольно просты, и сделать это проще и быстрее.
string.matches() компилируйте regex каждый раз, когда вы это делаете. Вместо этого посмотрите на классы Pattern/Matcher, которые позволяют кэшировать предварительно скомпилированные регулярные правила.
Другое дело — использовать группы regex без захвата, если вам не нужен результат сопоставления.