Скажем, что у меня есть список регулярных выражений (читается из внешнего источника - файла, базы данных и т.д.). Я хочу проверить, какое из этих регулярных выражений соответствует строке.
Я могу создать итерацию через все эти регулярные выражения и сопоставить их, но список может быть огромным, и это критическая операция.
Я могу объединить все эти регулярные выражения в один (с | между ними), но тогда проблема в том, что я могу идентифицировать только первое согласованное регулярное выражение, не все.
Еще одна идея могла бы заключаться в создании автомата для всех этих регулярных выражений и для обозначения конечных состояний, например, с помощью указателей соответствующего регулярного выражения. Я смотрел http://cs.au.dk/~amoeller/automaton/, библиотеку, которая кажется способной работать с регулярными выражениями и автоматом, но не уверена, что ее можно расширить, чтобы решить мою проблему.
Есть ли у вас другие идеи?
Чтобы прояснить некоторые комментарии, я добавил пример кода:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternTest {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a(?:b|c)a)|((?:a|b)ba)|(ab(?:a|c))");
Matcher m = p.matcher("aba");
System.out.println(m.matches());
System.out.println(m.groupCount());
for (int i = 0, n = m.groupCount(); i < n; i++) {
System.out.println(m.group(i));
}
}
}
распечатает
true
3
aba
aba
null
Как вы видите, только первая группа сопоставлена, и я не вижу способа сопоставления двух других.
Дополнительные выводы. Используя вышеприведенную библиотеку автомата, проблема сводится к следующему: если вы объединяете два или более автомата, как вы можете идентифицировать конечное состояние, с которым соответствует исходный автомат?