我有这样的文字:
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 :(得分: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/