Chinaunix

标题: a(?=b)c匹配的是什么? [打印本页]

作者: wangcn    时间: 2009-04-20 15:28
标题: a(?=b)c匹配的是什么?
好像什么都匹配不了。Zero-width positive lookahead到底应该怎么理解?
作者: waker    时间: 2009-04-20 15:34
abc
作者: wangcn    时间: 2009-04-20 15:39
标题: 回复 #2 waker 的帖子
你确定?
作者: justlooks    时间: 2009-04-20 15:44
什么都匹配不了
作者: waker    时间: 2009-04-20 15:45
标题: 回复 #4 justlooks 的帖子
我认为是匹配了,但他又不要匹配的东西
作者: wangcn    时间: 2009-04-20 15:47
标题: 回复 #4 justlooks 的帖子
请问Zero-width positive lookahead应该怎么理解。
作者: justlooks    时间: 2009-04-20 15:47
除非 这样写
a(?:=b).c 才能匹配abc
作者: waker    时间: 2009-04-20 15:47
用通俗的话说就是来一份蛋炒饭不要蛋
作者: justlooks    时间: 2009-04-20 15:49
原帖由 wangcn 于 2009-4-20 15:47 发表
请问Zero-width positive lookahead应该怎么理解。


来个不恰当的比喻,你脚在原地,头已经伸过去看了
作者: ly5066113    时间: 2009-04-20 15:55
原帖由 waker 于 2009-4-20 15:45 发表
我认为是匹配了,但他又不要匹配的东西


应该是什么也匹配不了吧。

以abc为例:
a(?=b) 匹配的是a 和 b之间0宽度的这个位置,它的后面不可能是c
因此 a(?=b)c 什么也匹配不了
作者: waker    时间: 2009-04-20 16:01
原帖由 ly5066113 于 2009-4-20 15:55 发表


应该是什么也匹配不了吧。

以abc为例:
a(?=b) 匹配的是a 和 b之间0宽度的这个位置,它的后面不可能是c
因此 a(?=b)c 什么也匹配不了

受教
作者: wangcn    时间: 2009-04-20 16:14
我是在另一个地方看到有人要匹配abc,但是顺序不定,最后那人给的答案是(?=.*a.*)(?=.*b.*)(?=.*c.*)\w+,能解释下吗?

原帖由 ly5066113 于 2009-4-20 15:55 发表


应该是什么也匹配不了吧。

以abc为例:
a(?=b) 匹配的是a 和 b之间0宽度的这个位置,它的后面不可能是c
因此 a(?=b)c 什么也匹配不了

作者: justlooks    时间: 2009-04-20 16:48
原帖由 wangcn 于 2009-4-20 16:14 发表
我是在另一个地方看到有人要匹配abc,但是顺序不定,最后那人给的答案是(?=.*a.*)(?=.*b.*)(?=.*c.*)\w+,能解释下吗?



这个能匹配乱序的abc可是也会匹配其他很多东西,你要光给个乱序的abc是没问题的,你要从一堆东西里挑出乱序的abc是不行的
作者: tianlijian    时间: 2009-04-20 20:48
什么 也匹配不了的。linux有这种正则吗?哪个命令支持这种语法。
Perl-Compatible Regular Expression support the syntax.
作者: ly5066113    时间: 2009-04-20 20:55
标题: 回复 #14 tianlijian 的帖子
grep 的 -P 参数就可以
作者: ly5066113    时间: 2009-04-20 21:03
标题: 回复 #11 waker 的帖子


个人意见,仅供参考,如有雷同,纯属巧合。
perlre 实在强大,但还了解不深。
作者: haimming    时间: 2009-04-20 21:32
学习了
作者: tianlijian    时间: 2009-04-20 23:07
原帖由 haimming 于 2009-4-20 21:32 发表
学习了

mrgreen是什么意思?
作者: 皇家救星    时间: 2009-04-21 00:11
原帖由 tianlijian 于 2009-4-20 23:07 发表

mrgreen是什么意思?


这个也是一个经典问题啊 其实就是代表

可以看做是一个文字表情
作者: woodie    时间: 2009-04-21 09:08
原帖由 ly5066113 于 2009-4-20 15:55 发表


应该是什么也匹配不了吧。

以abc为例:
a(?=b) 匹配的是a 和 b之间0宽度的这个位置,它的后面不可能是c
因此 a(?=b)c 什么也匹配不了

是这样的。
作者: woodie    时间: 2009-04-21 09:26
原帖由 wangcn 于 2009-4-20 16:14 发表
我是在另一个地方看到有人要匹配abc,但是顺序不定,最后那人给的答案是(?=.*a.*)(?=.*b.*)(?=.*c.*)\w+,能解释下吗?


这个正则会匹配一段含有a,b,c三个字符至少出现一次的串,其中夹杂其它字母数字也可以。不过可以简化一下:
(?=.*a)(?=.*b)(?=.*c)\w+
改成上面这样效果是一样的。
(?=re)匹配一个位置,它的后面匹配re。所以(?=.*a)(?=.*b)(?=.*c)就表示一个位置,后面必须出现一个带有a的串,一个带有b的串还有一个带有c的串。因此整个表达式就是匹配一个串,由字母数字下划线构成,并且abc至少出现一次。

如果要匹配不重复的abc连在一起,中间没有其它字符,换句话说匹配abc的各种排列,可以写成这样:
(?!.?(.)\1|(.).\2)[abc]{3}
作者: ly5066113    时间: 2009-04-21 10:00
原帖由 woodie 于 2009-4-21 09:26 发表

这个正则会匹配一段含有a,b,c三个字符至少出现一次的串,其中夹杂其它字母数字也可以。不过可以简化一下:
(?=.*a)(?=.*b)(?=.*c)\w+
改成上面这样效果是一样的。
(?=re)匹配一个位置,它的后面匹配re。所以(?=.*a)(?=.*b)(?=.*c)就表示一个位置,后面必须出现一个带有a的串,一个带有b的串还有一个带有c的串。因此整个表达式就是匹配一个串,由字母数字下划线构成,并且abc至少出现一次。

如果要匹配不重复的abc连在一起,中间没有其它字符,换句话说匹配abc的各种排列,可以写成这样:
(?!.?(.)\1|(.).\2)[abc]{3}


学习了。
(?!.?(.)\1|(.).\2)[abc]{3}  试着领悟下这个正则:

[abc]{3} 匹配了 abc 3个字母的所有排列,包括单个字母重复出现的情况
.?(.)\1  匹配 2个字符连续出现的情况
(.).\2    匹配 3个字符中首尾2个字符相同的情况
.?(.)\1|(.).\2  匹配 3个字符会出现重复的所有情况
(?!pattern)  向前断言不匹配,也就是从[abc]{3}排除了出现重复字母的所有情况
作者: ynchnluiti    时间: 2009-04-21 10:05
学习一下
作者: ubuntuer    时间: 2009-04-21 16:50





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