比如:有
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa
 6  0 911263 36877   0   0   0   0    0   0 611 11494 6356  9  5 86  1
 2  0 911243 36783   0   0   0   0    0   0 551 10546 6439  9  5 86  1
 4  0 911226 36678   0   0   0   0    0   0 542 9945 6362  9  4 87  0
 2  1 911245 36541   0   0   0   0    0   0 559 9901 6384  9  5 86  1
 3  0 911244 37905   0   0   0   0    0   0 766 10088 6824  9  5 87  0
.....................
这一串一串的字符串,(有回车换行)
一行一行的用正则表达式解析。然后。输出
fre  
36877   
36783   
36678   
36541   
37905   
前面的那个fre可以不考虑,就输出下面的那一行一行的,求教啊
正则表达式怎么写?谢谢了,什么语言都可以。

解决方案 »

  1.   

    var s = "r b avm fre re pi po fr sr cy in sy cs us sy id wa\n\
     6 0 911263 36877 0 0 0 0 0 0 611 11494 6356 9 5 86 1\n\
     2 0 911243 36783 0 0 0 0 0 0 551 10546 6439 9 5 86 1\n\
     4 0 911226 36678 0 0 0 0 0 0 542 9945 6362 9 4 87 0\n\
     2 1 911245 36541 0 0 0 0 0 0 559 9901 6384 9 5 86 1\n\
     3 0 911244 37905 0 0 0 0 0 0 766 10088 6824 9 5 87 0\n";var result = [];
    s.replace(/^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm, function($0, $1) {
        result.push($1);
    });
    alert(result.join("\n"));输出:
    fre
    36877
    36783
    36678
    36541
    37905
      

  2.   

    可以,   在页面,我还要转成java试试,完全迷糊了,
      

  3.   

    try...<script type="text/javascript"> 
    var str = "r b avm fre re pi po fr sr cy in sy cs us sy id wa\n\
     6 0 911263 36877 0 0 0 0 0 0 611 11494 6356 9 5 86 1\n\
     2 0 911243 36783 0 0 0 0 0 0 551 10546 6439 9 5 86 1\n\
     4 0 911226 36678 0 0 0 0 0 0 542 9945 6362 9 4 87 0\n\
     2 1 911245 36541 0 0 0 0 0 0 559 9901 6384 9 5 86 1\n\
     3 0 911244 37905 0 0 0 0 0 0 766 10088 6824 9 5 87 0\n";
    var reg = /^\s*(?:\S+\s+){3}(\S+)/mg;
    var result;
    while((result = reg.exec(str)) != null)
    {
        document.write(RegExp.$1 + "<br />");
    }
    </script>
      

  4.   

    方法很多…/\D*(\d*\D*){3}(\d+).+/mg
    ------------------------------------------------
    \D*匹配所有非数字例如每行开始的 ^和空格
    (\d*\D*){3} 匹配后续数字非数字的连续组合3次,此时为止就到你要的数据了
    然后分组捕获(\d+)捕获你要的结果
    .+,在单行模式下,匹配剩下所有字符直到行尾。
      

  5.   

    (刚回帖写错了,是在多行模式下)伴水的:
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm/^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    g:全局模式搜索全部匹配内容
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    m:多行模式,^表示行首,$表示行尾,.不匹配换行符。
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    ^行首开始匹配
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \s*捕获空白字符
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \S+捕获例如:6
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \s+捕获连续多个空白字符
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \S+捕获非空白字符,例如:0
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \s+捕获连续空白字符
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \S+捕获非空白字符,例如911263
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    \s+捕获你要的结果之前最后的空白字符
    /^\s*\S+\s+\S+\s+\S+\s+(\S+)/gm
    (\S+)捕获非空白字符,并装入分组,以便获取分组信息得到结果。
      

  6.   

    过客的:
    /^\s*(?:\S+\s+){3}(\S+)/mg;
    m,g同上
    ^同上
    /^\s*(?:\S+\s+){3}(\S+)/mg;
    \s*匹配行首开始的空白字符,尽可能多匹配
    /^\s*(?:\S+\s+){3}(\S+)/mg;
    (?:\S+\s+){3}是连续捕获“非空白字符多个”“空白字符多个”的组合3次就到你需要的位置了
    (\S+)同上,你要的结果。分组捕获,以便获取分组1信息。
      

  7.   

    问一个很弱弱的,转成JAVA,怎么都少了点什么东西,就是匹配不出来,试了一个小时,就是我的实例的内容是一个文本文件里面的,然后读出来,按照需求,只要匹配的,用其他语言咋整?
      

  8.   


    <403 np2smc1:/home/smc>vmstat 5 5System configuration: lcpu=4 mem=3744MBkthr    memory              page              faults        cpu    
    ----- ----------- ------------------------ ------------ -----------
     r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa
     6  0 911263 36877   0   0   0   0    0   0 611 11494 6356  9  5 86  1
     2  0 911243 36783   0   0   0   0    0   0 551 10546 6439  9  5 86  1
     4  0 911226 36678   0   0   0   0    0   0 542 9945 6362  9  4 87  0
     2  1 911245 36541   0   0   0   0    0   0 559 9901 6384  9  5 86  1
     3  0 911244 37905   0   0   0   0    0   0 766 10088 6824  9  5 87  0
    带入如上,
    需求:下面的列太多了,比如,我只想要第四列,也就是fre  
    36877  
    36783  
    36678  
    36541  
    37905当然,可以根据需求,显示需要显示的列,,用javascript,就是楼上有两位兄台写的可以,在下技术浅薄,所以还望各位帮忙转一下,C语言之类的,java之类的,都可以,实在是想不出怎么去掉前面和后面的,在此谢过各位了。
      

  9.   

    还有,就是用正则,一次性得到,不用replace,split之类的,就用一个正则表达式就得到他的结果,也就是截取某一列。谢谢各位了,分不够,可以另外开帖。
      

  10.   

    try... String str ="<403 np2smc1:/home/smc>vmstat 5 5\n"
     + "\n"
     + "System configuration: lcpu=4 mem=3744MB\n"
     + "\n"
     + "kthr    memory              page              faults        cpu\n"    
     + "----- ----------- ------------------------ ------------ -----------\n"
     + " r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa\n"
     + " 6  0 911263 36877   0   0   0   0    0   0 611 11494 6356  9  5 86  1\n"
     + " 2  0 911243 36783   0   0   0   0    0   0 551 10546 6439  9  5 86  1\n"
     + " 4  0 911226 36678   0   0   0   0    0   0 542 9945 6362  9  4 87  0\n"
     + " 2  1 911245 36541   0   0   0   0    0   0 559 9901 6384  9  5 86  1\n"
     + " 3  0 911244 37905   0   0   0   0    0   0 766 10088 6824  9  5 87  0\n";
    String pattern = "(?m)^\\s*(?:\\d+\\s+){3}(\\d+)";
    Matcher m = Pattern.compile(pattern).matcher(str);
    while(m.find())
    {
    System.out.println(m.group(1));
    }
      

  11.   

    谢谢楼上的lxcnn,
    这里不是需要group(1)
    而是直接用正则表达式得到那一列,如果是用group(1)的话,上面,他们写的也可以,呵呵,谢谢了,还是不纠缠这个东西来,先去学点基础的来,
      

  12.   


    嗯,最好不要纠缠这些哈
    只要是用在程序中,是group(1)还是group()其实并不重要,首先是可用,然后是效率
    语言不同,对正则的支持也不同,Java中的逆序环视(?<=exp)只支持固定长度的表达式,所以仅用一个正则而不用捕获组在Java中是做不到的,目前只有.NET等有限几种语言能做到
    而事上,不用捕获组未必就是好事,通常用逆序环视的效率是赶不上捕捉组的
    同样的,多个正则来实现未必就比一个正则实现差,主要看运用的是否得当了所以,因地制宜,还是不要纠缠于这些的好