Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

正则表达式使用多个预查代替“与”运算

  前几天在百度贴吧有个帖子:如何匹配以.js结尾,但不以.uc.js结尾的字符串?。虽然我写了个可以匹配到这个结果的正则表达式,但是使用的是传统的思路。虽然可以实现要求,但是逻辑太复杂,后来小羊(6楼)也给出了个正则表达式,虽然效率不如传统的思路高,但是它的逻辑很简单。
  我的正则表达式中,匹配“非”的部分的长度被固定了,如果修改它,就需要调整后面的长度。也就是说修改这个正则表达式匹配的内容我需要同时修改两个地方。虽然这不是什么大不了的事情,但是这样实用性就大打折扣了。而小羊的思路直接用预查构造了个逻辑“与”运算。这样无论遇到多么复杂的情况都可以匹配了。
  “与”运算是最基础的逻辑运算符之一了,但是正则表达式直接支持的只有“或”运算。其实正则也没必要刻意去支持这个,正则表达式的初衷本来就不是让我们用来搞这些乱七八糟的东西的。但是有时候,“与”运算却又是必须的。传统的方法实现“与”运算会通过非“或”的方式来实现。因为根据德摩根定律 a∨b⇔¬(¬a∧¬b) 我们可是使用“非”的方式,把“与”运算转换成“或”运算来实现。即使这样也还有问题,正则表达式对“非”运算的支持也是不怎么样的。通常可以使用[^字符]来匹配非某个字符集中的字符,但是这个方法匹配的只是字符,对字符串是没办法的。还有一个办法可以匹配“非”,那就是(?!字符串)。这个方法是可以用“非”匹配字符串,但是它是一个预查匹配,预查匹配是不消耗字符的,要强制让它消耗字符又要使用其它方法。总而言之,“非”匹配也是一件很麻烦的事情。所以,如果可以用“与”运算就不用那么麻烦的去构造一大堆的“非”表达式了。
  我们在搜索东西的时候,通常用到的都是或运算。比如在百度上搜索一堆关键词,这些关键词用空格隔开,百度就会把它们作为“或”匹配。但是非呢?百度当然会支持“非”运算的搜索了。比如直接搜索“次碳酸钴”会出来一堆“次碳酸铋”的内容,但是搜索“次碳酸钴 -次碳酸铋”就不会有“次碳酸铋”的内容了。而这个“非”的搜索,在构造SQL语句的时候显然是需要用And来连接的。这就是“与”运算的必要性。之前的文章中我也有说过用正则表达式来搜索JSON。但是那篇文章中只是说了简单的匹配而已。现在,如果学会了如果构造“与”运算,就可以在搜索东西的时候做到像百度这样的灵活了。
  现在做个小小的例子,比如在这个博客上发言。网名字段中如果同时包含:“次”、“碳”、“酸”、“钴”,这四个字就发不出去。无论你怎么替换顺序,中间插入什么和谐符号都不行。下面是实现它的JS代码。 var s="钴(和谐)碳(和谐)次(和谐)酸";
var r=/(?=.*?次)(?=.*?碳)(?=.*?酸)(?=.*?钴)/.test(s);
alert(r);
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^