CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  JavaScript

关于政则式的向前向后预查:var re=/(?=aaaa)aaa(?:a)/ig,

楼主tuowei15()2005-08-18 13:02:55 在 Web 开发 / JavaScript 提问

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

相关问题

  • var re = /\s+/ig; 什么意思?
  • aaaa
  • aaa
  • aaa
  • _T("aaa")与L"aaa" ?
  • What's "[^ -z]" and "ig"?
  • var testdate = new Date();
  • ■■■请教大家:何取得<option value="11111">aaaa</option>中的aaaa
  • request.form("AAA") 问题
  • SetRegistryKey(_T("aaa"));SetRegistryKey(_T("bbb"));

关键词

  • 字符
  • 匹配
  • aaaa
  • 字符串
  • aaa
  • 查找
  • aaaadddddd
  • ig
  • 消耗
  • 指的是啥

得分解答快速导航

  • 帖主:tuowei15
  • ice_berg16
  • qidizi

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo