2016-06-14 62 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。非常感謝你的幫助 –

相關問題