谈谈正则表达式常用的一些技巧

技巧总结
服务器君一共花费了194.515 ms进行了4次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

正则表达式在现在web的应用当中,如表单验证,url解析等,应用非常方便,比起普通的字符串解析性能上也高出不少。这里就做一些关于正则表达式通用技巧的个人小总结。

1.  一些常用的元字符

  • \w : 查找单词字符,包含字母数字及下划线,相当于[A-Za-z0-9_];
  • \d : 查找数字,相当于[0-9]
  • \s : 查找空白字符
  • \n : 查找换行符
  • . : 点号代表除换行符及行结束符外所有字符

2.  验证完整字符串,这在表单验证中常用到

var str = '18636200607';
var str2 = '10010';
var reg = /^\d{11}$/;
console.log(reg.test(str)); // return true;
console.log(reg.test(str2)); // return false;

这里的头尾的^$即是限定匹配的必须是整个字符串,而不是其中一部分,这对于表单验证里验证完整的合法输入很有用。

3.  验证一个完整的单词,可以用到\b

var str = 'hello world!';
var str2 = 'helloworld!';
var reg = /\bhello\b/;
console.log(reg.test(str)); //return true
console.log(reg.test(str2)); //return false

这里\b作为单词的边界条件进行判断,与^$夹着字符串相似,但\b夹的是单个单词

4.  捕获型分组与非捕获型分组

捕获型分组是小括号包围起来的一个分组表达式,里面匹配到的内容可以在之后调用,例子如下:

var str = '1234haha';
var reg = /(\d+)\w+/;
var result = reg.exec(str);
console.log(result[0]); //return '1234haha'
console.log(result[1]); //return '1234'

正则对象的exec方法与test不同,它如果匹配不成功返回null,成功则返回一个数组对象,[0]包含匹配到的完整字符串,[1][2]…等等则保存着各个子表达式里所捕获的内容(即小括号里获取的字符串);

小括号在正则里还有一个用处则是起到分组的作用,如: (abcd){4}

此表达式表示abcd整个字符串重复4次才能匹配成功,但小括号同时也影响了exec方法返回的捕获数组内容,此时如果不希望捕获内容影响,可以使用非捕获分组,非捕获分组格式是(?:…..);,如: (?:abcd){4}

此时小括号里的内容只会起到分组的作用,并不会捕获内容。

5.  方括号与分组表达式的或结构

方括号里的内容只会匹配单个字符,例如 [1234] 只会匹配1234里的一个字符,如果希望匹配的是一个字符串可以使用非捕获型分组来达成目的而或结构的分组表达式 (?:12|34) 会匹配12 或 34这两个字符里的其中一组。

示例代码:

var str = '1234';
var reg = /[1234]/;
var reg2 = /(?:12|34)/;
console.log(reg.exec(str)[0]); //retrun '1'
console.log(reg2.exec(str)[0]); //return '12'

6.  贪婪模式与非贪婪模式

\w+ 在匹配字符串 ‘hello’ 时会匹配整个字符串,此时为贪婪模式。但 \w+? 在匹配时 则只匹配 ‘h’单个字符串,此时为非贪婪模式。也就是说在量词(*, +, ?, {5, })后面加个?即形成非贪婪模式,会尽可能在不影响匹配成功的情况下,少匹配字符。示例代码:

var str = 'hello';
var reg = /\w+/;
var reg2 = /\w+?/;
console.log(reg.exec(str)[0]); //retrun 'hello'
console.log(reg2.exec(str)[0]); //return 'h'

7.  反向引用

捕获型分组里捕获的内容在三种情况下可以被引用:

  • 第一是exec方法回复的数组里,从[1]开始
  • 第二是test或exec方法执行后,RegExp.$1开始之后存储捕获内容
  • 第三则是在正则表达式里的反向引用,如\1 \2这种形式

看下例子:

var str = '<td>这里是td</td>';
var reg = /<(\w+)>.*<\/\1>/;
console.log(reg.test(str)); // return true

此处正则表达式里\1则是引用了前面的捕获型分级(\w+)的内容。

8.  正向预搜索及不匹配

预搜索与^$\b一样本身不匹配内容,只是提供一个判断。看下例子:

var str = 'HelloWorld';
var reg = /Hello(?=World)/;
var reg2 = /Hello(?!World)/;
console.log(reg.test(str)); // return true
console.log(reg2.test(str)); //return false

(?=…)代表前面要匹配的字符后面必须带有指定的字符才能匹配成功,(?!…)则相反,代表不包含指定的字符。javascript不支持反向预搜索,这里就不介绍了。

9.  正则对象的方法

RegExpObject.test 方法:这是表单验证中常用到的方法,如果匹配成功返回true,反之false。

RegExpObject.exec 方法:exec方法很强大,它基本提供了所有所需要的信息,返回的是一个数组,数组的[0]存放的是匹配到的完整字符串,[1][2]开始存放的是捕获型分组(也就是正则里的小括号包围的内容)捕获到的字符串,该数组还包含额外两个属性index及input; index标识的是匹配结果的字符串位置,input标识的是正则表达式。其实exec最强大的地方是在于,对于带g全局标识的正则表达式(如/\w+/g),在每次执行exec的时候,都会将正则对象的lastIndex设置为前一个匹配到的字符串的最后一个位置。换句话说,你就可以利用这个特性进行整个字符串的遍历,并配合捕获型分组,就可以得到你想要的字串内容:看如下例子

//解析url
var url = 'http://www.taobao.com/?ver=1.0&q=search';
var reg = /(\w+)=([^&]*)/g;
var obj = {};
var result;
while(result = reg.exec(url)){
    obj[result[1]] = result[2];
}
console.log(obj); //return {ver:'1.0', q:'search'}

以上就可以遍历正则匹配整个字符串,配合捕获分组就可以得到你想要的字串了。

String.match 方法 :如果正则表达式不带g全局标识,字符串的match方法与正则对象的exec对象相似,只进行一次匹配,返回一个数组,[0]存放的是完整匹配字串,[1]以后存放捕获分组的内容。如果正则表达式带g全局标识,则match方法回返的内容大不一样,也是一个数组,但是是从[0]开始各个存放匹配到的完整匹配字串,就不会再存放捕获分组的内容了。有时这在简单匹配整个字串的时候比起exec简便些。

看下例子:

var str = '1: 哈哈,2: 呵呵, 3: 嘿嘿';
var reg = /\d:/g;
console.log(str.match(reg)); //return ['1:', '2:', '3:']

以上直接回返匹配到的结果数组。

String.replace 方法:字符串的replace方法带两个参数,第一个参数是查找匹配的字符串,第二个参数是要替换成的内容,也可以是个function匿名函数。如果是正则替换方式,则第二个参数里的$有特殊的含义,$1 $1…代表的是之前正则表达式里的捕获分组得到的字串,$&代表的是匹配得到的完整字串,$`代表匹配字串左侧的文本,$’代表匹配字串右侧的文本。

看下面个例子:

var str = 'hello world!';
var reg = /(\w+)\s(\w+)/;
str = str.replace(reg, '$2 $1');
console.log(str); //return 'world hello!'

这里利用到$1 $2的捕获分组的内容。

再看个例子:

var str = 'background-color';
var reg = /-(\w)/g;
str = str.replace(reg, function(w, s){
    return s.toUpperCase();
});
console.log(str); // return 'backgroundColor'

对于加g的正则表达式,replace方法会循环执行替换操作,replace方法里的第二个参数如果是function,则function的第一个参数是完整的正则匹配字串,第二个参数开始则是捕获分组得到的字串。

String.split方法及String.search方法较为简单,可自行参考相关资料。

本文地址:http://www.nowamagic.net/librarys/veda/detail/1074,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1074

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《C专家编程》 林登 (LinDen.P.V.D) (作者), 徐波 (译者)

《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍。书中C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。全书撷取几十个实例进行讲解,对C程序员具有非常高的实用价值。《C专家编程》可以帮助有一定经验的C程序员成为C编程方面的专家,对于具备相当的C语言基础的程序员,《C专家编程》可以帮助他们站在C的高度了解和学习C++。

更多计算机宝库...