假如有这样一个文本是分列的..
Proto Local Address Foreign Address State PID
[color=red]TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1208[/color]
TCP 192.168.16.109:1061 207.46.124.221:80 ESTABLISHED 1840
现在现在要得到State为LISTENING(红色那列)的Local Address列和PID列的内容.
就是说得到的结果为
0.0.0.0:135 1208
请问用正则该如何得到结果...感谢大家麻烦给个思路吧...
[b]问题补充:[/b]
呵呵,要求用正则来搞定,而且只许用一条正则..我也没办法啊...上面交代下来的... :cry: :cry:
Linux shell 怎么做呢.提供下思路嘛,我是一点思路都没有..
用零宽断言的话也没法取到这样间隔的列...我是没办法了 :cry: :cry:
[b]问题补充:[/b]
感谢lovewhzlq不过要求是用正则直接得到而不是通过java做处理的..
同时还要求了要State为LISTENING...
用零宽断言可以满足State为LISTENING但是我能写出单一列或者是前几列,而没法写出要求的间断那种....
[img]http://dl.iteye.com/upload/attachment/154742/e5ccabab-f965-3bae-829f-823295a58698.jpg[/img]
[code="shell"]
$ cat log
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1208
TCP 192.168.16.109:1061 207.46.124.221:80 ESTABLISHED 1840
$ perl -e 'print $1, $2, "\n" if m/TCP\s*(?:\d{1,3}(?:.\d{1,3}){3}:\d+)\s*(\d{1,3}(?:.\d{1,3}){3}:\d+)\s*LISTENING\s*(\d+)/' -n log
0.0.0.0:01208
[/code]
这不就是用空格分隔的字符串一行嘛
得到这行字符串,用string.split(" ")得到字符串数组,不就得到了
Linux shell 可以么?
[code="java"]
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Reg26608 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1208 ";
System.out.println(processStr(str));
}
public static String processStr(String str)
{
Pattern p = Pattern.compile("(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)");
Matcher m = p.matcher(str);
StringBuilder result = null;
if(m.find())
{
result = new StringBuilder();
result.append(m.group(2));
result.append(" ");
result.append(m.group(5));
return result.toString();
}
return null;
}
}
[/code]