求教一个解析字符串并输出截取字符串的正则表达式

sebatinsky 2010-08-27 04:20:07
比如:有
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可以不考虑,就输出下面的那一行一行的,求教啊
正则表达式怎么写?谢谢了,什么语言都可以。
...全文
508 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
13896 2011-06-21
  • 打赏
  • 举报
回复
我看看
sebatinsky 2010-08-31
  • 打赏
  • 举报
回复
呵呵,谢谢了,只是他们某天讨论了这个问题而已,所以我就想试试,结果还真难道了我,所以想贴出来让大家试试,其实我不喜欢纠缠这些,钻研过,就OK了。
kaifadi 2010-08-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wuyazhe 的回复:]

(刚回帖写错了,是在多行模式下)

伴水的:
/^\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+……
[/Quote]

分析得很彻底,不但有解决方法,而且还分析得这么多东西出来,很不错!
-过客- 2010-08-30
  • 打赏
  • 举报
回复
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));
}
-过客- 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sebatinsky 的回复:]
谢谢楼上的lxcnn,
这里不是需要group(1)
而是直接用正则表达式得到那一列,如果是用group(1)的话,上面,他们写的也可以,呵呵,谢谢了,还是不纠缠这个东西来,先去学点基础的来,
[/Quote]

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

所以,因地制宜,还是不要纠缠于这些的好
sebatinsky 2010-08-30
  • 打赏
  • 举报
回复
还有,就是用正则,一次性得到,不用replace,split之类的,就用一个正则表达式就得到他的结果,也就是截取某一列。谢谢各位了,分不够,可以另外开帖。
sebatinsky 2010-08-30
  • 打赏
  • 举报
回复

<403 np2smc1:/home/smc>vmstat 5 5

System configuration: lcpu=4 mem=3744MB

kthr 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之类的,都可以,实在是想不出怎么去掉前面和后面的,在此谢过各位了。
兔子-顾问 2010-08-30
  • 打赏
  • 举报
回复
贴你测试的代码。
sebatinsky 2010-08-30
  • 打赏
  • 举报
回复
问一个很弱弱的,转成JAVA,怎么都少了点什么东西,就是匹配不出来,试了一个小时,就是我的实例的内容是一个文本文件里面的,然后读出来,按照需求,只要匹配的,用其他语言咋整?
sebatinsky 2010-08-30
  • 打赏
  • 举报
回复
这两天去学车了,不好意思,刚回来了,先道个歉,然后在看,呵呵
兔子-顾问 2010-08-30
  • 打赏
  • 举报
回复
过客的:
/^\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信息。
兔子-顾问 2010-08-30
  • 打赏
  • 举报
回复
(刚回帖写错了,是在多行模式下)

伴水的:
/^\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+)捕获非空白字符,并装入分组,以便获取分组信息得到结果。
兔子-顾问 2010-08-30
  • 打赏
  • 举报
回复
方法很多…

/\D*(\d*\D*){3}(\d+).+/mg
------------------------------------------------
\D*匹配所有非数字例如每行开始的 ^和空格
(\d*\D*){3} 匹配后续数字非数字的连续组合3次,此时为止就到你要的数据了
然后分组捕获(\d+)捕获你要的结果
.+,在单行模式下,匹配剩下所有字符直到行尾。
sebatinsky 2010-08-30
  • 打赏
  • 举报
回复
谢谢楼上的lxcnn,
这里不是需要group(1)
而是直接用正则表达式得到那一列,如果是用group(1)的话,上面,他们写的也可以,呵呵,谢谢了,还是不纠缠这个东西来,先去学点基础的来,
sebatinsky 2010-08-27
  • 打赏
  • 举报
回复
其实那些字符是从文本之类的读出来的,一行一行的解析,只保留某一列而已,老大们能不能给个解释啊。
-过客- 2010-08-27
  • 打赏
  • 举报
回复
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>
sebatinsky 2010-08-27
  • 打赏
  • 举报
回复
可以, 在页面,我还要转成java试试,完全迷糊了,
sebatinsky 2010-08-27
  • 打赏
  • 举报
回复
55555,先实验下来,没有好好学啊,呵呵,搞的头都大了,
王集鹄 2010-08-27
  • 打赏
  • 举报
回复
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
王集鹄 2010-08-27
  • 打赏
  • 举报
回复
/^\s*\S+\s+\S+\s+(\S+)/gm
加载更多回复(1)

87,899

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧