2016-06-14 60 views
4

我有以下文字:正则表达式中搜索时,文本被发现,其他文本丢失

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

我需要寻找各application,当是udp,如果inactivity-timeout不同于1800(应用程序TWO)或是udp并且没有定义不活动(应用程序三)。 我已经解决了第一种情况下使用正则表达式:

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

但我没有找到办法让第二。

有什么建议吗?

回答

1

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

就我个人而言,我会将问题分成两部分。首先,提取应用程序,然后检查应用程序是否符合要求。这是我的尝试。

public class ApplicationReadOut { 

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

    public boolean checkApplication(String app) { 
     String[] lines = app.split("\r\n"); 
     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 \r\n 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))); 
    } 

} 

我希望这是有用的,你可以修改这个适合您的需要:-)

+0

嗨GreenThor,谢谢你的回应。我用Java标记它是一个错误,我的意思是java正则表达式,我不能这么做:-( –

+0

无法做任何事情,对不起。但是你很好回复:-) – GreenThor

0

这应该做的工作:

application\s*([a-z]*)\s*{(?=(?=\s*protocol udp*)(?!inactivity-timeout.*))|(?=(?=\s*protocol udp*)(?!inactivity-timeout\s1800))(?=}) 

您需要使用/img为多,情况 - 敏感和全球搜索。

说明和你的例子here

+0

嗨尼尔斯,非常感谢您的回复。我已经测试了一段时间,我不确定它是否按预期工作。我认为这项工作是由第一个OR完成的。如果我在APP TWO中将innactivity值更改为1800,那么正则表达式仍然匹配它。如果我删除第二个OR正则表达式仍然匹配APP TWO和THREE。非常感谢你的帮助 –

相关问题