关于正则表达式

tp168
关于正则表达式

如下正则表达式要怎么表达:
1、匹配包含may大写或小写单词的行;
2、匹配以ab或cd打头的行;
3、匹配连续出现多次ab的行(如abab1、ababab1)。

[[i] 本帖最后由 tp168 于 2008-7-1 10:59 编辑 [/i]]

blackold
回复 #1 tp168 的帖子

请楼主花点时间看置顶贴,这对你十分有帮助。

timdcn
~/[Mm][Aa][Yy]/
~/^[ab] || [cd]/
~/abab*/

[[i] 本帖最后由 timdcn 于 2008-7-1 10:50 编辑 [/i]]

blackold
[quote]原帖由 [i]timdcn[/i] 于 2008-7-1 10:48 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8708698&ptid=1185414][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
~/[Mm][Aa][Yy]/
~/^[ab] || [cd]/
~/abab*/ [/quote]
不符合LZ的要求吧?
~//<[Mm][Aa][Yy]/>/
~/^(ab|cd)/
~/(ab){2,}/

tp168
回复 #2 blackold 的帖子

就是看了发现有问题啊,那个文章里说1、匹配包含may大写或小写单词的行;是[mayMAY]明显不对,这个应该是匹配m/a/y/M/A/Y字符的行。

tp168
~/[Mm][Aa][Yy]/->不对,这个把型如mAy也匹配出来了,我只要may或MAY;
~/^[ab] || [cd]/->试验了,也不对
~/abab*/ ->这个是可以,但是如果个数不确定,如我要多次出现ab字符串的呢要怎么写?

timdcn
[quote]原帖由 [i]blackold[/i] 于 2008-7-1 10:51 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8708753&ptid=1185414][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

不符合LZ的要求吧?
~///
~/^(ab|cd)/
~/(ab){2,}/ [/quote]
呵呵,没看清楚要求

blackold
回复 #5 tp168 的帖子

没错。这是字符类 character class。文章也可能出错,有怀疑就去做实验,之后你就明白了。

无声无息
[url]http://regexpal.com/[/url]

tp168
其实我的问题本质就是正则表达式里很多都是针对单个字符,像[]、*、/{n,m/},如果针对前面是字符串的要怎么写?

[[i] 本帖最后由 tp168 于 2008-7-1 11:06 编辑 [/i]]

blackold
[quote]原帖由 [i]tp168[/i] 于 2008-7-1 11:04 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8708938&ptid=1185414][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
其实我的问题本质就是正则表达式里很多都是针对单个字符,像[]、*、/{n,m/},如果针对前面是字符串的要怎么写? [/quote]
从LZ的“其实”来看,确实需要看置顶。 它会回答你的这些问题。

tp168
多谢楼上的,我知道了我的问题了。
grep "(ab|cd)",在linux下是不行的,要这样grep "/(ab|cd/)",一个单词确实用(),但是前后都要加/,不然它会认为是(字符。

blackold
回复 #12 tp168 的帖子

你的问题太多了。先了解BRE和ERE吧。
grep -E '(ab|cd)'  也可以。
grep 支持BRE, 而egrep( grep -E)支持ERE.

tp168
awk中不支持{n,m}格式的正则表达式?如匹配第4列出现两个e的行:
awk '{if ($4~/e{2}/) print $0}' test,结果为空

cat test
m.tansley       05/99   48311   green   8       40      44
j.lulu  06/99   48317   green   9       24      26
p.bunny 02/99   5555548 yellow  12      35      28

blackold
回复 #14 tp168 的帖子

默认情况下awk不支持interval expression, 试试 awk --re-interval 或 --posix