InputStream上的正则表达式

时间:2015-10-26 22:45:56

标签: java regex stream inputstream

我正在解析来自第三方硬件的流的输入。东西打印的信息是为了人类。它包括关键字和我不关心的其他角色。我想采用一个流,并使用正则表达式查找其中一个关键字的下一个匹配项。然后我可以做一个switch语句并找出发送的命令。

我无法使用Scanner类,因为读取被阻止,我无法中断它以停止线程。我无法将流关闭作为解决方法。

我有什么图书馆可以用来做我想做的事吗?我找到Streamflyer,但这似乎有点矫枉过正,也许不是我想要的。它还建议FilterInputStreamFilterReader,但我不认为这些是我正在寻找的。

1 个答案:

答案 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();
}