有人知道一个好的流式 Java正则表达式解析器吗?
特别是,我希望能够通过观察XML元素流的内容并检测内容是否以及在何处与给定的正则表达式匹配。例如,我想从MediaWiki元素流的内容中观察SAX“characters”回调,但是检测匹配==([^ = \ n] +)==的子串在何处发生。
诀窍是内容以不确定的大小排列,这意味着匹配的子字符串可能会在多个回调中被打破。
当然,简单的解决方案是简单地缓冲所有回调并在长字符串上运行Java的内置regexp引擎。不幸的是,这会占用太多内存。
复杂性的下一步是将正则表达式转换为DFA并检测DFA何时进入“接受”状态。我想知道是否有人知道是否有一些Java库来简化这个过程。
我一直在看Ragel;但这要求在编译时指定DFA。
答案 0 :(得分:0)
在这种情况下,Matcher
的{{3}}可能有用:
当此方法返回true时,更多输入可能会更改上次搜索的结果。
您可以尝试匹配每个块,如果没有匹配但hitEnd
返回true,则必须附加下一个块并重试。
如果匹配器以某种方式也返回了可能的起始索引,那将是很好的,但这似乎不可能。
答案 1 :(得分:-1)
缓冲那些回调,每次关闭一个标签时检查regexp,丢弃缓冲区