Инкрементное сопоставление с образцом (RegEx) в Java?

Есть ли способ или эффективная библиотека, которая допускает добавочное сопоставление регулярных выражений в Java?

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

Я понимаю, что это, вероятно, будет чрезвычайно трудной и недостаточно четко определенной проблемой, поскольку можно представить себе регулярные выражения, которые могут соответствовать целому выражению или любой его части или не иметь решения до тех пор, пока поток не будет закрыт в любом случае. Даже что-то столь же тривиальное, как.* Может соответствовать H, He, Hel, Hell, Hello и так далее. В таком случае я хотел бы, чтобы поток сказал: "Да, это выражение могло бы соответствовать, если бы оно было закончено сейчас, и вот группы, которые оно вернет".

Но если Pattern внутренне шагает по строке, соответствует символу за символом, это может быть не так сложно?

1 ответ

Решение

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

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

Другие вопросы по тегам