加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式搜索何时找到文本而其他文本丢失

发布时间:2020-12-14 05:47:27 所属栏目:百科 来源:网络整理
导读:我有以下文字: application ONE { protocol tcp; destination-port 50;}application TWO { protocol udp; destination-port 51; inactivity-timeout 800;}application THREE { protocol udp; destination-port 500;} 我需要搜索每个应用程序,当协议是udp时,
我有以下文字:

application ONE {
    protocol tcp;
    destination-port 50;
}
application TWO {
    protocol udp;
    destination-port 51;
    inactivity-timeout 800;
}
application THREE {
    protocol udp;
    destination-port 500;
}

我需要搜索每个应用程序,当协议是udp时,如果不活动超时不同于1800(应用程序TWO)或协议是udp并且没有定义不活动(应用程序三).
我用正则表达式解决了第一个案例:

(?s)(?=protocol udp).*(inactivity-timeout (?!1800))

但我还没有办法获得第二个.

有什么建议?

解决方法

你用Java标记了这一点,所以我给你一个Java解决方案,虽然我不确定你的帖子是否是你想要的.

我个人会将问题分成两部分.首先,提取应用程序,然后检查应用程序是否满足要求.这是我的尝试.

public class ApplicationReadOut {

    public static String EXAMLPLE = "application ONE {rn"
        +"    protocol tcp;rn"
        +"    destination-port 50;rn"
        +"}rn"
        +"application TWO {rn"
        +"    protocol udp;rn"
        +"    destination-port 51;rn"
        +"    inactivity-timeout 800;rn"
        +"}rn"
        +"application THREE {rn"
        +"    protocol udp;rn"
        +"    destination-port 500;rn"
        +"}rn";

    public boolean checkApplication(String app) {
        String[] lines = app.split("rn");
        boolean udp = false;
        boolean timeoutDiffers = true;
        boolean timeoutMentioned = false;
        for (String line : lines) {
            if (line.trim().equals("protocol udp;"))
                udp = true;
            if (line.trim().equals("inactivity-timeout 1800;"))
                timeoutDiffers = false;
            if (line.trim().startsWith("inactivity-timeout "))
                timeoutMentioned = true;
        }
        return udp & (timeoutDiffers | !timeoutMentioned);
    }

    public String[] extractApplications(String text) {
        String[] applications = text.split("}(r*n*)*"); 
        // the rn thing is to ignore blank lines in between applications
        ArrayList<String> goodApps = new ArrayList<String>(applications.length);
        for (int i = 0; i < applications.length; i++) {
            applications[i] += "}"; // this was removed by split
            if (checkApplication(applications[i]))
                goodApps.add(applications[i]);
        }
        return goodApps.toArray(new String[0]);
    }


    public static void main(String[] args) {
        ApplicationReadOut aro = new ApplicationReadOut();
        System.out.println(Arrays.toString(aro.extractApplications(EXAMLPLE)));
    }

}

我希望这很有用,你可以修改它以满足你的需求:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读