关于政则式的向前向后预查:var re=/(?=aaaa)aaa(?:a)/ig,
var re=/(?=aaaa)aaa(?:a)/ig,
s="aaaadddddd"
m=s.match(re);
alert(m);
为何也能匹配?
我的意思是:aaa的前面必须是四个a,后面必须是一个a,匹配中间的三个a,为何结果不为null?
问题点数:100、回复次数:15Top
1 楼ice_berg16(寻梦的稻草人)回复于 2005-08-18 13:29:02 得分 50
你弄错了。正向预查和负向预查不是这样。
--------------------------
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
--------------------------
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
Top
2 楼zhanyou(阿香)回复于 2005-08-18 14:00:23 得分 0
學習中,
請問什麽時候用子表達式Top
3 楼czq9966(宁录)(毛主席领导咱闹革命……)回复于 2005-08-18 14:36:20 得分 0
学习Top
4 楼tuowei15()回复于 2005-08-18 18:22:01 得分 0
还是不懂。 (寻梦的稻草人 贴出来的两段教材,我已经看过多次了,就是不懂才来问的。郁闷。。。。
var re=/(?=aaaa)aaa(?:a)/ig,
s="aaaadddddd"
m=s.match(re);
就是说:(?=aaaa)匹配了左侧的四个‘a’,但是真正在匹配aaa时候,又从最左侧开始。我的本意是要求aaa左侧context是四个a,Top
5 楼tuowei15()回复于 2005-08-22 08:49:46 得分 0
我希望查找某个子串,要求它的左侧,右侧的上下文满足一定的条件。请问该怎样做?政则是 确实比较的难以琢磨,一些资料上也是说的不太清楚Top
6 楼tuowei15()回复于 2005-08-22 08:55:44 得分 0
“预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 ”
---这个关于政则是的说明资料在网上真流行。可是我想,除了已经对政则是比较熟悉的兄弟之外,别的人看这句话是会不明白的。就我这个例子 var re=/(?=aaaa)aaa(?:a)/ig,
s="aaaadddddd"
请那位解释一下:“在一个匹配发生后”中的匹配指的是啥?
“最后一次匹配之后”指的是啥?
”开始下一次匹配“指的是啥
“不是从包含预查的字符之后”指的是啥?
谢谢
Top
7 楼rayFairy()回复于 2005-08-22 09:01:50 得分 0
顶顶顶顶顶顶顶顶顶顶顶顶顶
这个问题迷惑我很久了,问了几次也没人给个答案。
那个微软教材写的不好。特别是预查部分。。
我现在不用正则,而用len(),left,right,mid等字符串函数来代替正则
只是觉得这样效率低。。。Top
8 楼ice_berg16(寻梦的稻草人)回复于 2005-08-22 09:54:07 得分 0
举个例子:
var str = "Windows 95 is a operation, Windows 2000 is the higher version, windows XP is the newest version.";
var re = /Windows (?=95|98|NT|2000)/g;
alert(str.match(re));
代码执行后,系统从字符串开始的W开始查找,找到Windows,发现后面是95,符合要求(这就是一次匹配),由于是非获取匹配,95是不被保存的,保存的只有"Windows ";找到以后继续找向下查找,这时候查找从95开始,而不是从95后的空格开始,(就是不消耗字符,而不是从包含预查的字符之后开始.)
又找到Windows ,发现后面是2000,也符合要求,将"Windows "保存,从2000开始查找.Top
9 楼tuowei15()回复于 2005-08-22 12:55:39 得分 0
谢谢,关于”不消耗字符“的意思我已经懂了。那么还请问;
1.我的例子中 var re=/(?=aaaa)aaa(?:a)/ig,
s="aaaadddddd",”aaa“左侧的(?=aaa)是否会起作用,就是说:/Windows (?=95|98|NT|2000)/g,是一种lookforword预查,而我使用的是一种lookbehind预查,(java的政则是有这种预查)。请问javascript中有这种预查么?它会起作用么?
2.如果我希望我搜索的子串的左侧context是"aaaa",我的式子:(?=aaaa)aaa 是不能满足这个要求的?
我必须采用/aaaa(aaa)/,然后取$1才能获得我想要的结果串?就是说对于左侧context,不能使用预查?就是说:我想要 左侧符合一定条件的东东,我只能通过使用子表达式来获取,不能使用整个的匹配结果?
Top
10 楼tuowei15()回复于 2005-08-22 12:56:10 得分 0
也不知道我说清楚我的一问没有,谢谢Top
11 楼ice_berg16(寻梦的稻草人)回复于 2005-08-22 13:46:45 得分 0
JS中好像没有lookbehind,都是向前查找的。
你只能采用/aaaa(aaa)/的形式来获得Top
12 楼qidizi(qidizi)回复于 2005-08-22 13:51:22 得分 50
有人问过同样的问题;
我找到一个变通办法,但是要是用下面这样的方法还少一个条件
var s = ".sf>ggggggdd< >l></><dddddg><<<dddt>>>>>";
var reg = /(?=<)[^>]*(?=>)/g;
var find;
while( (find = reg.exec(s) ) != null)
{
alert(find);
}
不办法找到预查并消耗掉匹配字符的办法
或是匹配但不返回的办法(呵呵,有什么用,我想只能是用来消耗匹配吧)Top
13 楼qidizi(qidizi)回复于 2005-08-22 14:01:55 得分 0
那位只要解决上面的问题就是消耗掉预查不返回
就可以得到一个以<开头,以>结束但不包含的字符串
Top
14 楼qidizi(qidizi)回复于 2005-08-22 14:18:12 得分 0
想了一会,认为很难,即不能跳过<,也不有什么可以消耗掉它的东东,我想只有用组合表达式才行了,
不知那位有办法解决?Top
15 楼tuowei15()回复于 2005-08-23 11:09:01 得分 0
对,想用它来lookbehind只怕是不行了,只能通过$1等办法来达到目的了。
真的很感谢大家的热心指教。
揭帖了Top




