看书的时候说JavaScript中不支持负向前瞻,但有解决办法就是匹配一个单词,但且仅当它后面没有不需要匹配的单词
解决方案 »
- 请问这JS是用什么加密的?
- JSP编译错误,无法运行,求哪位好心人帮解决一下
- js怎么操作指定行啊
- 要做个类客户端的web界面,希望大家给点建议
- 谁能帮我看下 我写的这些语句是否有错误
- JS储存iframe焦点的问题,谢谢各位了
- 下面的一段javascript代码,为什么运行到SetTimeout("reloop()",1000);这一句老出错呢?
- 如何利用Javascript在客户端取得服务器端时间?我想做一个服务器端时间的倒计时,请高手指点!!
- 为什么我的层放在<TD><DIV></DIV></TD>中间,我的层把TD给顶开,顶高了?谢谢
- 怎样修改删除指定内容?
- 请高手帮忙看哈,一下面这段代码的意思。
- js求教
另外javascript的正侧表达式是最牛的,比其它编程语言里的都要牛!
<script type="text/javascript">
re = /([a-z]+(?!\d))/ig; //负向前瞻符(?!)
//将匹配后面不包含数字的所有字母,并且不会返回(?!\d)中的内容
str = "theforeverA1 ZL";
alert(str.match(re));//返回theforever,ZL 而A1不符合条件被过滤
</script>
对一楼的言论表示无语关于负向前瞻(逆序环视),js是不支持的
有许多折中的办法,具体的问题需要具体的对待
当然没有逆序环视确实很不方便
但很明显,只要真有需要,自然是可以通过升级加强的。“js的正则何来强大一说?”这一句话就把它定死了,我觉得不合适。
perl自不必提js没有java等的占有优先量词,没有php等语言的内嵌变量,没有逆序环视
更没有.net正则库的固化分组,条件表达式等
而且js的bug以及不同浏览器引擎带来的不同解释
如果太把js的正则当回事,就有必要了解下js的正则能做什么,不能做什么。而且要随时做好有bug的准备。
(?!) --- Negative Lookahead(否定顺序环视)即负向前瞻
(?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
(?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻楼主问的是负向前瞻,不知楼上是理解错,还是看错了。即便不光是逆序环视,还包括你上面所说的和其它语言相比的一些JS“人有它无”的特性,之前或目前是没有,但只要有必要,它自然可以有。何况,反过来,你是否也要去要求其它那些语言的任意一种支持所有语言根据自身优势所发展出来的特性的合集呢?我想没有任何一种语言能胜任,即使它是上帝创造的语言,它也不能担当魔鬼的角色吧(除非堕落的原本就不是魔鬼,而是上帝本身)。我反对的是“由于javascript的历史比较悠久,也比较古老,因此有许多特性是不支持的。”这话泛泛且眼光固化的话。“许多特性”包括的范围也过大了。从最初的版本到现在,JS已经升级了10多次的版本。几乎每年一个。和其它语言比起来,难道它就只是原地踏步吗?这所谓“许多特性”其中的一些,难道没有在最近一两年里被收纳吗?难道在即将出来的新版本中不会有更多的特性支持吗?归纳起来,很简单,就是不能没有一个发展的眼光和意识。作为日新月异的IT技术从业者,如果真的可以无视更新,那就无法想像了。另外,你说的也远远跑题了。顺序环视谓之前瞻,逆序环视谓之后瞻。楼主问的是负向前瞻,这和逆序环视完全无关。从你楼上的问话来看,你对它们的概念都很模糊呢。
任何一门语言或者框架都有局限性,如果一门语言中的一个类库、一个功能不是强项,那就要清楚的认识其问题所在。我说的何来强大一说就是针对当前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
关于其他的问题也不一一列举了。如果只是简单的验证,那么可能没那么多问题,但是有时候如果你需要写一些库或者框架类的应用。那就要小心了
盲目认为它万能才不正常。也正因如此,可以很自然地把它看成一个发展中的长势良好的事物,知其不足,观其发展,而不是求全责备用苛求语气说它缺这缺那,更不能象上面我引用的那个说法,说它是一个古老悠久似乎从诞生就不再更新升级一样。其实除了上面负向前瞻这个完全可以理解的学习中的打眼一过的误解问题,应该说我们并没有真正的相对立的立场,而只是从不同角度来说这个事情。包括我引用的看到的那个作者说的话,也可能只是一时状态,甚至他对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了。
(?=)
(?!)
属于正向预查(?<=)
(?<!)
是负向预查作用都知道,只是名字...
但是跟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吧。
我所说的这些是针对一楼那句javascript的正侧表达式是最牛的,比其它编程语言里的都要牛!而言的
另外js是原型式的面向对象,从根来说Crazywa所言没什么问题。
面试官的考虑有很多,我总结如下
1、炫耀
2、团队习惯
3、个人理解层面
4、个人思考习惯亮子哥,你所说的一切我没有意见,你也提到我们没有相对立的观点。
不过针对很快这个观点我持保留意见,就经验而言,我无法和你比,但是我们都应该清楚WEB发展至今的情况,IE6什么时候死不是问题了(就目前微软的战略方向来看,浏览器兼容性可能会得到一部分的改善)。但是html5、css3、js2.0都是比较遥远的事,我也着手在搜集相关的资料在学习,但是什么时候能大规模的使用真是个谜。js中的功能缺少的自己想办法弥补,不过话说回来,web技术并非是独立存在的,无谓于js取代XX之说。所以各司其职的角度来说,js的功能已经基本够用了。以至于道格拉斯库克福德都把js精简成精华部分来使用。
总之,只要你真喜欢学习,并努力去学,终会山高人为峰的。
其次就是posix,这是工业标准,php和mysql等都支持的.linux领域也支持.看过#C的正则说明,比vbscript正则功能强了好多。基本上所有的都支持了!除了功能之外,字符集支持和性能可能是比较突出的。
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
还想问下
所说的环视和预查是什么意思
你这啥书啊??赶紧扔了吧。
<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:truealert(reBed.test(sToMatch1));//outputs:false
alert(reBed.test(sToMatch2));//outputs:truealert(RegExp.$1);//outputs:bed
</script>
因为作者自己代码写错(而且是那么一个看到运行有错误就应该能检查出来的简单错误),就说JS不支持了,这样的著书态度,这本书还能相信吗?岂不是看多就错多?可以说这个作者恐怕就是个东抄西拼,压根就不怎么真正会技术的,恰恰越这样人越喜欢写书,没有一个严肃认真谨慎负责的态度。我上面贴了
(?=) --- Positive Lookahead(肯定顺序环视)即正向前瞻
(?!) --- Negative Lookahead(否定顺序环视)即负向前瞻
(?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
(?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻
环视和预查,都是指Look这个词,配置ahead/behind,意为:向前/后去看/查。一般用环视这个名称较多些,来自英语的直译,“预查”一词倒更符合中国人的习惯。但“预查”没有方向性,还是要象“顺序环视”“逆序环视”那样加上两个字,所以为简略称谓故,就用“正向前瞻”“负向前瞻”了,文了点,理解了就顺耳了。
(?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
(?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻
貌似这两个不支持啊
(?<=) --- Positive Lookbehind(肯定逆序环视)即正向后瞻
(?<!) --- Negative Lookbehind(否定逆序环视)即负向后瞻
貌似这两个不支持啊(?<=) --- 直接用(?:)放前面 来肯定
(?<!) --- 直接用(?:)放前面 来否定