我正在解析来自第三方硬件的流的输入。东西打印的信息是为了人类。它包括关键字和我不关心的其他角色。我想采用一个流,并使用正则表达式查找其中一个关键字的下一个匹配项。然后我可以做一个switch
语句并找出发送的命令。
我无法使用Scanner
类,因为读取被阻止,我无法中断它以停止线程。我无法将流关闭作为解决方法。
我有什么图书馆可以用来做我想做的事吗?我找到Streamflyer,但这似乎有点矫枉过正,也许不是我想要的。它还建议FilterInputStream和FilterReader,但我不认为这些是我正在寻找的。 p>
答案 0 :(得分:1)
我有一个可以帮助解决这个问题的开源项目,它比基于正则表达式的解决方案要快得多:
http://mtimmerm.github.io/dfalex/
概述:
使用DfaBuilder为每个关键字制作匹配.*KEYWORD
的DFA。指定该模式的最简单方法是Pattern.maybeRepeat(CharRange.ALL).then("KEYWORD");
调用build(),你就会得到一个DfaState。依次为输入的每个字符调用state=state.getNextState(c)
,当您在关键字的末尾时,state.getMatch()会告诉您匹配了哪个关键字。
编辑: 这座建筑是这样的:
//The <Integer> here means you want integer results
DfaBuilder<Integer> builder = new DfaBuilder<>();
//Lets say you have a list of keywords:
for (int i=0; i<keywords.size(); ++i)
{
Pattern pat = Pattern.maybeRepeat(CharRange.ALL)
.then(keywords.get(i));
builder.addPattern(pat, i); //when this pattern matches, we get i out
}
DfaState<Integer> startState = builder.build(null);
然后像这样使用它:
DfaState<Integer> st = startState;
for (... each input character c ...)
{
st = st.getNextState(c);
//if this is non-null, then it's the index of the matched keyword
//in the keywords list
Integer match = st.getMatch();
}