2014-01-30 191 views
0

我有一個文本是這樣的:正則表達式中提取文本

SrcAddr: 0.0.21.201 
DstAddr: 7.202.10.100 
NextHop: 0.33.189.142 
InputIf: 19 
OutputIf: 50715 

我想使用正則表達式提取這樣數據。

String SrcAddr = "0.0.21.201"; 
    String DstAddr = "7.202.10.100"; 
    //ect... 

我已經試過各種表情,但仍然沒有運氣。如果有人能幫助非常欣賞的

+0

你能證明你所嘗試過的嗎? – Kieveli

+0

這個問題似乎是無關緊要的,因爲它在發佈前沒有顯示研究工作。 – OGHaza

回答

2

您可以使用這樣的事情:

String input = "SrcAddr: 0.0.21.201\n"+ 
      "DstAddr: 7.202.10.100\n"+ 
      "NextHop: 0.33.189.142\n"+ 
      "InputIf: 19\n"+ 
      "OutputIf: 50715"; 

String SrcAddr=getMatchedString("SrcAddr",input); 
String NextHop=getMatchedString("NextHop",input); 
String InputIf=getMatchedString("InputIf",input); 
String OutputIf=getMatchedString("OutputIf",input); 

System.out.println(SrcAddr); 
System.out.println(NextHop); 
System.out.println(InputIf); 
System.out.println(OutputIf); 

.......... 

public static String getMatchedString(String word,String input){ 

    String REGEX = "(?:"+word+":)\\s(.*)"; 
    Pattern p = Pattern.compile(REGEX); 
    Matcher m = p.matcher(input); 
    if (m.find()) { 
     String matched = m.group(1); 
     return matched; 
    } 
    return null; 

} 

OUTPUT

0.0.21.201 
0.33.189.142 
19 
50715 

REGEX DEMO

0

你可以試試:

String in = " SrcAddr: 0.0.21.201\nDstAddr: 7.202.10.100\n NextHop: 0.33.189.142\n InputIf: 19\n OutputIf: 50715"; 

    Pattern src = Pattern.compile("SrcAddr:\\s+([\\d\\.]+)"); 
    Pattern dst = Pattern.compile("DstAddr:\\s+([\\d\\.]+)"); 
    Pattern nextHop = Pattern.compile("NextHop:\\s+([\\d\\.]+)"); 
    Pattern inputIf = Pattern.compile("InputIf:\\s+([\\d]+)"); 
    Pattern outputIf = Pattern.compile("OutputIf:\\s+([\\d]+)"); 

    Matcher srcMatcher = src.matcher(in); 
    Matcher dtsMatcher = dst.matcher(in); 
    Matcher nextHopMatcher = nextHop.matcher(in); 
    Matcher inputIfMatcher = inputIf.matcher(in); 
    Matcher outputIfMatcher = outputIf.matcher(in); 

    if (srcMatcher.find()) { 
     System.out.println(srcMatcher.group(1)); 
    } 
    if (dtsMatcher.find()) { 
     System.out.println(dtsMatcher.group(1)); 
    } 
    if (nextHopMatcher.find()) { 
     System.out.println(nextHopMatcher.group(1)); 
    } 
    if (inputIfMatcher.find()) { 
     System.out.println(inputIfMatcher.group(1)); 
    } 
    if (outputIfMatcher.find()) { 
     System.out.println(outputIfMatcher.group(1)); 
    } 

希望它能幫助!

1
String input = "SrcAddr: 0.0.21.201\n"+ 
       "DstAddr: 7.202.10.100\n"+ 
       "NextHop: 0.33.189.142\n"+ 
       "InputIf: 19\n"+ 
       "OutputIf: 50715"; 

String SrcAddr = input.replaceAll("(?s).*SrcAddr:\\s([\\d\\.]+)\\s.*", "$1"); 
String DstAddr = input.replaceAll("(?s).*DstAddr:\\s([\\d\\.]+)\\s.*", "$1"); 

System.out.println(SrcAddr); 
System.out.println(DstAddr); 

打印:

0.0.21.201 
7.202.10.100 
-1

看看這個在線的Java正則表達式測試儀: http://www.regexplanet.com/advanced/java/index.html

我在你的文本粘貼到 '輸入1',然後把在正則表達式:

\d*[.]\d*[.]\d*[.]\d* 

結果:

[10,20] 0.0.21.201 
[32,44] 7.202.10.100 
[56,68] 0.33.189.142 

別忘了 - 當你在Java代碼中使用它,你需要躲避反斜線:

"\\d*[.]\\d*[.]\\d*[.]\\d*" 

而且,這裏是一個有趣的正則表達式的遊戲,以幫助你學習正則表達式: http://regexcrossword.com/

1

嘗試了這一點,它需要你的字符串,多行作爲輸入,並通過線吐出來的數字(IP的端口,並通過它的外觀)線。因爲這個問題本身就是正則表達式,所以我在閱讀過程中沒有付出太多的努力,所以我只是使用掃描儀,而不是在閱讀/編寫文本文件時煩惱,我假設你已經有了這部分。

import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class MainRegex { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String input = "SrcAddr: 0.0.21.201\n"+ 
         "DstAddr: 7.202.10.100\n"+ 
         "NextHop: 0.33.189.142\n"+ 
         "InputIf: 19\n"+ 
         "OutputIf: 50715"; 

     Scanner scanner = new Scanner(input); 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      String output = matchString(line); 
      System.out.println(output); 
     } 
     scanner.close(); 

    } 

    public static String matchString(String input){ 
     String regex = "(?:\\w*:)((?:\\d+\\.?)*)"; 
     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(input); 
     if (m.find()) { 
      String matched = m.group(1); 
      return matched; 
     } 
     return null; 
    } 

} 

輸出:

0.0.21.201 
7.202.10.100 
0.33.189.142 
19 
50715 

在掃描循環,可以處理線。如果您只想獲取數字,或者用String [name] =「[number]」替換每行,我無法理解您的問題。如果是這樣的話,你只需要在掃描器的循環中篡改一些內容,並且刪除正則表達式中的非捕獲組(也就是說,刪除\ w之前的「?:」),以便捕獲這些單詞。

希望它有幫助!

+1

順便說一句,使用這種方式,你不需要事先知道自己的單詞,如「SrcAddr」等。 – CodingDuckling