Chinaunix

标题: (sed)正则表达式问题 [打印本页]

作者: ideaz    时间: 2007-09-12 19:03
标题: (sed)正则表达式问题
echo 'aaa:2008<hr><br>aaa:2009<hr><br>' | sed 's/.*:\([^<]*\).*/\1/'

2009

echo 'aaa:2008<hr><br>aaa:2009<hr><br>' | sed 's/[^:]*\([^<]*\).*/\1/'

:2008

这里的正则结果为什么会出现 : ,现在只需要第一个 : <hr>之间的字符。
作者: ly5066113    时间: 2007-09-12 19:15
echo 'aaa:2008<hr><br>aaa:2009<hr><br>' | sed 's/.*:\(.*\)<hr>.*:.*/\1/'
作者: ideaz    时间: 2007-09-12 22:43
我现在就是想懂明白,正则表达式贪婪与非贪婪的问题。

书上说[^<]这样可以非贪婪,但不明白[^:]结果为什么会有个:
作者: starvalley    时间: 2007-09-12 22:49
因为正则表达式有最长匹配的特性
作者: starvalley    时间: 2007-09-12 22:59
echo 'aaa:2008<hr><br>aaa:2009<hr><br>' | sed 's/[^:]*:\([^<]*\).*/\1/'
作者: ideaz    时间: 2007-09-13 00:06
我的理解是
[^:]*  为非: 字符的0个或者多个,所以一直到第一个:aaa,所以就出现了: ,后面的[^<]为非<字符的0个或者多个,所以就匹配第一个<之前的内容2008,因为只需要“2008”所以后面再加上一个.*
作者: fwloveme    时间: 2007-09-13 12:28
标题: 回复
6楼理解正确了!呵呵
作者: mxbao    时间: 2007-09-13 16:32
sed 's/^[^0-9]*\([0-9]\+\).*/\1/'
作者: ly5066113    时间: 2007-09-13 16:39
原帖由 ideaz 于 2007-9-13 00:06 发表
我的理解是
[^:]*  后面的[^<]为非<字符的0个或者多个,所以就匹配第一个<之前的内容2008


后面的[^<]为非<字符的0个或者多个,所以就匹配第一个<之前的内容:2008
:也是[^<]
作者: 灿烂小猪    时间: 2007-09-13 16:54
echo 'aaa:2008<hr><br>aaa:2009<hr><br>' | sed 's/^.*\:\(....\).*/\1/'

不知道我这样的写法严谨不?请大家多多指教。谢谢。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2