正则表达式提取文本

时间:2014-01-30 12:33:56

标签: java regex

我有这样的文字:

 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... 

我尝试了各种各样的表情,但仍然没有运气。如果有人可以帮助欣赏很多

5 个答案:

答案 0 :(得分: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;

 }

<强>输出

0.0.21.201
0.33.189.142
19
50715 

<强> REGEX DEMO

答案 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

答案 2 :(得分: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之前删除“?:”)以便它也能捕获这些单词

希望它有所帮助!

答案 3 :(得分: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));
    }

希望它有所帮助!

答案 4 :(得分:-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/