一个正则的问题

假如有这样一个文本是分列的..

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]