有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

InputStream上的java正则表达式

我正在解析来自第三方硬件流的输入。这个东西打印出的信息是给人类的。它包括关键字和其他我不关心的字符。我想获取一个流,并用regex查找下一个出现的关键字。然后我可以执行一个switch语句并找出发送了什么命令

我不能使用Scanner类,因为读取被阻止,我不能中断它来停止线程。我也不能关闭该流作为一个工作区

有没有图书馆可以用来做我想在这里做的事情?我找到了Streamflyer,但这似乎有些过分,可能不是我想要的。它还建议FilterInputStreamFilterReader,但我不认为这些是我正在寻找的


共 (1) 个答案

  1. # 1 楼答案

    我有一个开源项目可以帮助解决这个问题,它比基于正则表达式的解决方案快得多:

    http://mtimmerm.github.io/dfalex/

    概述:

    • 使用DfaBuilder为每个关键字生成一个匹配.*KEYWORD的DFA。指定该模式的最简单方法是Pattern.maybeRepeat(CharRange.ALL).then("KEYWORD");

    • 调用build()将得到一个DfaState。依次为输入的每个字符调用state=state.getNextState(c),每当你在关键字末尾时,都要声明。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();
    }