看书的时候说JavaScript中不支持负向前瞻,但有解决办法就是匹配一个单词,但且仅当它后面没有不需要匹配的单词

解决方案 »

  1.   

    没明白你的意思,但肯定你要的东西javascript里如果indexOf和lastIndexOf做不到,那么正侧表达式能做到。
    另外javascript的正侧表达式是最牛的,比其它编程语言里的都要牛!
      

  2.   

    现找了个例子,我改写了一下,意思更明了
    <script type="text/javascript">
    re = /([a-z]+(?!\d))/ig; //负向前瞻符(?!)
    //将匹配后面不包含数字的所有字母,并且不会返回(?!\d)中的内容
    str = "theforeverA1 ZL";
    alert(str.match(re));//返回theforever,ZL 而A1不符合条件被过滤
    </script>
      

  3.   

    在网上的确看到这样的说法“由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的。”比较荒唐的论断。电脑(包括整个软硬件方面的技术)出现也很久了,今天有这么多高级丰富的功能,但它不还是电脑吗,只是不断升级了。JS出现也很久,但它一成不变吗?不也在版本升级?拿历史跟现在甚至将来比较的时候,只应该用发展的眼光看待发展的事物,硬要拿今天的乞丐也能用手机和以前的皇帝都没有这个待遇相比来寻找幸福感而不是比较他们各自在自己时代中的社会尊严和地位的话,只是自欺欺人的自慰。
      

  4.   

    js的正则何来强大一说?
    对一楼的言论表示无语关于负向前瞻(逆序环视),js是不支持的 
    有许多折中的办法,具体的问题需要具体的对待
    当然没有逆序环视确实很不方便
      

  5.   

    相比PERL来说,JS对正则的确不仅是后引入的,而且当初也是轻量级的支持。
    但很明显,只要真有需要,自然是可以通过升级加强的。“js的正则何来强大一说?”这一句话就把它定死了,我觉得不合适。
      

  6.   

    很多人以为包括那些桌面程序更擅长的功能也都很适合用JS去实现,并热衷问这种问题。我觉得他们对JS太盲目热情了。但反过来,我也相信JS在它适合干和应该干的方面,能力会不断加强。
      

  7.   

    单就正则的使用来说
    perl自不必提js没有java等的占有优先量词,没有php等语言的内嵌变量,没有逆序环视
    更没有.net正则库的固化分组,条件表达式等
    而且js的bug以及不同浏览器引擎带来的不同解释
    如果太把js的正则当回事,就有必要了解下js的正则能做什么,不能做什么。而且要随时做好有bug的准备。
      

  8.   

    javascript的正侧表达式是最牛的?我没有这种感觉
      

  9.   

    (?=) --- Positive Lookahead(肯定顺序环视)即正向前瞻
    (?!) --- Negative Lookahead(否定顺序环视)即负向前瞻
    (?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
    (?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻楼主问的是负向前瞻,不知楼上是理解错,还是看错了。即便不光是逆序环视,还包括你上面所说的和其它语言相比的一些JS“人有它无”的特性,之前或目前是没有,但只要有必要,它自然可以有。何况,反过来,你是否也要去要求其它那些语言的任意一种支持所有语言根据自身优势所发展出来的特性的合集呢?我想没有任何一种语言能胜任,即使它是上帝创造的语言,它也不能担当魔鬼的角色吧(除非堕落的原本就不是魔鬼,而是上帝本身)。我反对的是“由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的。”这话泛泛且眼光固化的话。“许多特性”包括的范围也过大了。从最初的版本到现在,JS已经升级了10多次的版本。几乎每年一个。和其它语言比起来,难道它就只是原地踏步吗?这所谓“许多特性”其中的一些,难道没有在最近一两年里被收纳吗?难道在即将出来的新版本中不会有更多的特性支持吗?归纳起来,很简单,就是不能没有一个发展的眼光和意识。作为日新月异的IT技术从业者,如果真的可以无视更新,那就无法想像了。另外,你说的也远远跑题了。顺序环视谓之前瞻,逆序环视谓之后瞻。楼主问的是负向前瞻,这和逆序环视完全无关。从你楼上的问话来看,你对它们的概念都很模糊呢。
      

  10.   

    译法有很多种,也没看到他的英文注解,对负向前瞻的理解错误是我的问题
    任何一门语言或者框架都有局限性,如果一门语言中的一个类库、一个功能不是强项,那就要清楚的认识其问题所在。我说的何来强大一说就是针对当前js正则的缺陷和不那么强大而言的。这许多特性包括js1.7也没有收纳,而且。有的特性也是bug一堆。
    另外js最大的缺憾就是浏览器引擎解释的不一致性,我记得有一次在讨论正则问题的时候就说过
    http://topic.csdn.net/u/20101228/23/8db2a7f7-1f51-4c24-9da1-ac8258eb1634.html?4238
    http://topic.csdn.net/u/20110111/00/5bc889c6-14b0-4297-bd6a-383c719ba1b2.html
    关于其他的问题也不一一列举了。如果只是简单的验证,那么可能没那么多问题,但是有时候如果你需要写一些库或者框架类的应用。那就要小心了
      

  11.   

    有些还没有,使用时应注意查验资料,这个没问题。
    盲目认为它万能才不正常。也正因如此,可以很自然地把它看成一个发展中的长势良好的事物,知其不足,观其发展,而不是求全责备用苛求语气说它缺这缺那,更不能象上面我引用的那个说法,说它是一个古老悠久似乎从诞生就不再更新升级一样。其实除了上面负向前瞻这个完全可以理解的学习中的打眼一过的误解问题,应该说我们并没有真正的相对立的立场,而只是从不同角度来说这个事情。包括我引用的看到的那个作者说的话,也可能只是一时状态,甚至他对JS的感情深厚和急迫到不能容忍它还不具备一些特性。还有JS非常明显的缺憾就是各个浏览器引擎解释的不一致性,这还包括各个浏览器引擎不同版本的差异,由于用户使用情况的差异和更新的不同步,让开发多了非常多的麻烦。甚至AJAX出现之前JS曾被说成是可以用CSS把这个鸡肋取代的,都说AJAX让JS浴火重生。而我对AJAX从开始到现在,都不象很多人那样狂热。只是对AJAX、JS或任何一个发展中的技术抱着平常心,并相信它们会变得越来越好。对技术侧重点、优势侧重点、限制或短处,这些即使不能全部掌握,但也是一开始就应该有的意识。我只是在这个基础上,谈它的发展,用象对所有技术都同样怀有的乐观心态。说实话,我只有在技术的世界里才能感到理性和乐观,反过来,也因为这种珍贵,所以必须珍惜地采取理性的态度面对,不想让超悲观或超乐观的意识蒙骗了时间。JS版本的问题,其实现在就快出2.0了。2006年10月是1.7 (主要增加特性:Pythonic generators + Iterators + let),2008年6月是1.8 (主要增加特性: Generator expressions + Expression closures),这两年已经出了1.8.1和1.9了(主要增加特性: Minor Updates ,ECMAScript 5 Compliance )。所以很快的组合是HTML5+CSS3+JS2了。
      

  12.   

    以前听说是
    (?=)
    (?!) 
    属于正向预查(?<=) 
    (?<!) 
    是负向预查作用都知道,只是名字...
      

  13.   

    To:cj205论正则,个人书上见过的一些来说Perl算是比较强大的。
    但是跟PHP、Java、C#之流比,就没有必要了。
    毕竟大家都是阉了的正则,就没有必要彼此的五十步笑百步。
    而且,各自都有自己的特色,所应用的领域不同,也就没有什么可比性。
    尤其不喜欢拿纯OO语言跟JS比。
    OO程序员的加入,导致ECMAScript家族(ActionScript、JavaScript)有了新的血液,一些新的编程思想和新的程序实现方式层出不穷,其中EXTJS尤其耀眼。JAVA的ZK框架(不需要程序员写javascript的ajax框架)也很闪亮。当然,还有就是正则表达式的引入。
    但是,JavaScript只是JavaScript,它不是Java、也不是C。
    它只是同时支持面向过程和面向对象,是一种动态的脚本语言。
    它有自己编程方式,OO固然好,但是不应该拿OO的标准来评定一个非纯OO语言,因为js中对象的调用效率极低,为什么总拿其他的语言的长处来比js的短处?君不见C#的反射何其蹩脚,js却毫不费力?
    至于一些公司招聘将OO作为重点来考js程序员就更是令人费解:难道就是因为你主考官大人是OO出身?您老面试C程序员的时候也考OO?
    至于拿兼容性来说事就更没必要了。这本就是很无奈的事情,亦如Linux、Windows的不兼容,C应用于各种设备、各个领域,兼容性就更无从谈起,拿这个说事,那C语言岂不是首当其冲?
    人无完人,何况是一个编程语言。
    JavaScript只是JavaScript,就让它做JavaScript吧。
      

  14.   

    这几天没有网络
    我所说的这些是针对一楼那句javascript的正侧表达式是最牛的,比其它编程语言里的都要牛!而言的
    另外js是原型式的面向对象,从根来说Crazywa所言没什么问题。
    面试官的考虑有很多,我总结如下
    1、炫耀
    2、团队习惯
    3、个人理解层面
    4、个人思考习惯亮子哥,你所说的一切我没有意见,你也提到我们没有相对立的观点。
    不过针对很快这个观点我持保留意见,就经验而言,我无法和你比,但是我们都应该清楚WEB发展至今的情况,IE6什么时候死不是问题了(就目前微软的战略方向来看,浏览器兼容性可能会得到一部分的改善)。但是html5、css3、js2.0都是比较遥远的事,我也着手在搜集相关的资料在学习,但是什么时候能大规模的使用真是个谜。js中的功能缺少的自己想办法弥补,不过话说回来,web技术并非是独立存在的,无谓于js取代XX之说。所以各司其职的角度来说,js的功能已经基本够用了。以至于道格拉斯库克福德都把js精简成精华部分来使用。
      

  15.   

    呵呵,是的。之所以我上面说没什么真正对立观点,也是因为很多方面或有同感或也是差异不大。而且,你说的话也并非对我或者是只对我而言,对于其它还不了解的新手来说,有些东西行不行,有没有,是应该了解知道的。所以,除了澄清一个术语理解的错误外,其它的也只是针对那个只看出生不看发展的“古老论”,若论古老,JS怎么都称不上古老,C/C++,DELPHI,JAVA……所有这些里,JS反而算年轻的。当然JS的升级扩展,因为它的角色定位,相对来说不可能有它们变化那样大,这是另话。对JS的预期,我上面表面似乎说得过于乐观,比如“只要是好的有必要的,就可以拿进来”,其实,还是有前提的,就是“有必要”,对于一项应用广泛的技术而言,每次升级变动,都是十分谨慎的,不是少数人感觉什么重要就应该加进去。反过来,如果某些东西,对于JS来讲真的达到这种程度,全球开发者都有广泛的反映,则纳入升级议题也是自然的。我也说过,没有任何一种语言敢说能集或者想要集万千优点于一身,JS当然也不能。最关键的是角色定位,作为前端的脚本语言,很多方面注定是目前根本不用考虑的(不过,技术这东西,还真不能说死,谁知道遥远以后的样子呢,应该说一切皆有可能)。我做软件开发的时间比网络开发都长,所以对这些都还能有客观认识。Crazywa说的最后一句很精练,让JS作JS,什么意思都在这里了。希望新人们从这个对立点不强的讨论中,知道首先应该认识到JS的角色定位,这样对自己的学习和以后的运用就会有一个明确的方向指导。然后只要循序渐进,就会在学习中了解到具体的哪些可以,哪些不可以,哪些虽然可以,但不一定推荐那么做(有的事情,前端和后端都能做,或者CSS和JS都能做,但肯定有一个更合适)。
    总之,只要你真喜欢学习,并努力去学,终会山高人为峰的。
      

  16.   

    据说是不支持的。在linux领域,perl正则应是最强大的,PHP目前主要应用的就是兼容perl正则。
    其次就是posix,这是工业标准,php和mysql等都支持的.linux领域也支持.看过#C的正则说明,比vbscript正则功能强了好多。基本上所有的都支持了!除了功能之外,字符集支持和性能可能是比较突出的。
      

  17.   

    引用下书上的例子:
    var sToMatch1="bedroom";
    var sToMatch2="bedding";
    var reBed=/(bed(?!room))/
    alert(sToMatch1.test(reBed));//outputs:false
    alert(sToMatch2.test(reBed));//outputs:true
    alert(RegExp.$1);//outputs:bed
    还想问下
    所说的环视和预查是什么意思
      

  18.   

    能不能,你运行一下不就知道了,这还费事吗?
      你这啥书啊??赶紧扔了吧。
    <script type="text/javascript">
    var sToMatch1="bedroom";
    var sToMatch2="bedding";
    var reBed=/(bed(?!room))/;//alert(sToMatch1.test(reBed));//outputs:false
    //alert(sToMatch2.test(reBed));//outputs:true
    alert(reBed.test(sToMatch1));//outputs:false
    alert(reBed.test(sToMatch2));//outputs:true
    alert(RegExp.$1);//outputs:bed
    </script>
      因为作者自己代码写错(而且是那么一个看到运行有错误就应该能检查出来的简单错误),就说JS不支持了,这样的著书态度,这本书还能相信吗?岂不是看多就错多?可以说这个作者恐怕就是个东抄西拼,压根就不怎么真正会技术的,恰恰越这样人越喜欢写书,没有一个严肃认真谨慎负责的态度。我上面贴了
    (?=) --- Positive Lookahead(肯定顺序环视)即正向前瞻
    (?!) --- Negative Lookahead(否定顺序环视)即负向前瞻
    (?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
    (?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻 
    环视和预查,都是指Look这个词,配置ahead/behind,意为:向前/后去看/查。一般用环视这个名称较多些,来自英语的直译,“预查”一词倒更符合中国人的习惯。但“预查”没有方向性,还是要象“顺序环视”“逆序环视”那样加上两个字,所以为简略称谓故,就用“正向前瞻”“负向前瞻”了,文了点,理解了就顺耳了。
      

  19.   

    js 对正则的实现 得确没 perl .net java 之类的强大
      

  20.   

    JavaScript中不支持负向前瞻,但有解决办法就是匹配一个单词,当且仅当它后面没有不需要匹配的单词。
      

  21.   

    负向前瞻,跟正向前瞻相反 (p1)(?!p2),当需要匹配的内容中,在p1这个组合后面,只有不存在与P2匹配的内容是,才匹配,而不返回(?!p2中的值),书上就是这么写的,不清楚你明不明白。举个例子,([jJ]ava)(?!Script) 匹配 "javascipt",但是不匹配"javaScript" ,就是因为有负向前瞻的存在
      

  22.   


    (?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
    (?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻 
    貌似这两个不支持啊
      

  23.   


    (?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
    (?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻 
    貌似这两个不支持啊(?<=) ---  直接用(?:)放前面 来肯定
    (?<!) ---  直接用(?:)放前面 来否定