正则表达式详解(以JavaScript为例)

每次用的时候都要找一遍资料,琢磨一遍语法,不胜其烦,终于下定决心把他们都记下来,一次性搞定,永绝后患!:)

一、什么是正则表达式?

    简单地说,就是基于字符串的模式匹配工具。实际应用中包括字符串的查找、提取、替换等等。

二、基本语法

    Javascript中的正则表达式的形式一般如下:

    /……/

其中“/”为定界符,两个“/”中为模式字符串,也就是用户将要查找的对象的模式,如:/a?b+c*/。该表达式表示的字符串的构成模式为:0个或1a开头,接着是1个以上的b,最后是任意个c(含0个),如babbcabcbbabbabbcc,……。

1.重复匹配语法

在上述表达式中有3个最常用的模式表示符“?”、“+”、“*”,正则表达式中称为“元字符”,他们的含义如下:

    ?”:本字符前面的字符(或字符串或表达式)只能出现0次或1次;

    +”:本字符前面的字符(或字符串或表达式)最少出现1次;

    *”:本字符前面的字符(或字符串或表达式)可以出现任意次。

    上面的3个元字符模式是固定的,并不灵活,如果要手工定制,可以使用如下模式:

    {n}n >= 0,匹配n次,如'o{2}',能匹配food,但不能匹配Tom

    {n,}n >= 0,匹配n次以上,如'o{2,}',可以匹配food,foood,fooood,……。

    {n,m}n >= 0m >= 0, n <= m ,最少匹配n次且最多匹配m次,如'o{2,3}',可以匹配food,foood

以上介绍的为重复匹配语法,总结如下:

重复语法

语法解释

语法例子

?

匹配01

5?匹配50,不匹配非50

+

匹配一次或多次

/S+匹配一个以上/S,不匹配非一个以上/S

*

匹配0次以上

/W*匹配0以上/W,不匹配非N*/W

{n}

匹配n次字符

/d{3}匹配/d/d/d,不匹配/d/d/d/d/d/d

{n,}

匹配n次和n次以上

/w{2}匹配/w/w/w/w/w以上,不匹配/w

{n,m}

匹配n次上m次下

/s{1,3}匹配/s,/s/s,/s/s/s,不匹配/s/s/s/s

各种匹配语法的使用方法与上面类似,不再详述,罗列如下:

2字符匹配语法:

字符语法

语法解释

语法例子

/d

匹配数字(0~9

‘/d’匹配8,不匹配12

/D

匹配非数字

‘/D’匹配c,不匹配3

/w

匹配任意单字符

‘/w/w’ 匹配A3,不匹配@3

/W

匹配非单字符

‘/W’匹配@,不匹配c

/s

匹配空白字符

‘/d/s/d’匹配3 d,不匹配abc

/S

匹配非空字符

‘/S/S/S’匹配A#4,不匹配3 d

.

匹配任意字符

‘....’匹配A$ 5,不匹配换行;

[…]

匹配括号中任意字符

[b-d]匹配bcd, 不匹配e

[^…]

匹配非括号字符

[^b-z]匹配a,不匹配b-z的字符;

3.字符定位语法:

重复语法

语法解释

语法例子

^

定位后面模式开始位置

 

$

前面模式位于字符串末端

 

/A

前面模式开始位置

 

/z

前面模式结束位置

 

/Z

前面模式结束位置(换行前)

 

/b

匹配一个单词边界

 

/B

匹配一个非单词边界

 

4.转义匹配语法:

转义语法

涉及字符(语法解释)

语法例子

“/”+实际字符

/ . * + ? | ( ) { }^ $

例如://匹配字符“/”

/n

匹配换行

 

/r

匹配回车

 

/t

匹配水平制表符

 

/v

匹配垂直制表符

 

/f

匹配换页

 

/nnn

匹配一个8进制ASCII

 

/xnn

匹配一个16进制ASCII

 

/unnnn

匹配416进制的Uniode 

 

/c+大写字母

匹配Ctrl-大写字母

例如:/cS-匹配Ctrl+S

5.操作符及其执行优先级:

优先级从高到低顺利如下:

/ 转义符 

(), (?, (?=), [] 圆括号和方括号 

*, +, ?, {n}, {n,}, {n,m} 限定符 

^, $, /anymetacharacter 位置和顺序 

|“或”操作 

()” 是把字符串组合在一起,作为一个整体来看待,即通常所说的“组”。“()”中的内容必须同时出现在目标对象中,内容中出现“|”例外。

“|”是选择运算符,如:X|Y,表示匹配X或者Y,只能匹配其中1个。

“^”在“[]”内时是否定运算符,如:[^A-C],表示匹配除ABC外的任何字符;只有在“[]”外时,才能视作定位符。

三、在Javascript中使用正则表达式

正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹配或代替一个串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)

1.正则表达式构造函数:

new RegExp("pattern"[,"flags"]);

参数说明:

Pattern:一个正则表达式文本

Flags:如果存在,将是以下值:

g: 全局匹配。换句话说,就是找到所有的匹配,而不是在找到第一个之后就停止

i: 忽略大小写

gi: gi的组合

除属性 g i 之外,正则表达式就没有其它像属性一样的特性了。如果将构造函数 RegExp的静态属性multiline设置为true,那么模式匹配将以多行的模式进行。在这种模式下,锚字符 ^ $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的一行的开头和结尾。例如: 模式 /Java$/ 匹配的是 "Java",但是并不匹配"Java/nis fun" 。如果我们设置了 multiline 属性,那么后者也将被匹配:

RegExp.multiline = true;

2.示例:

以网上最常见的去除首尾空格的正则表达式为例:

     String.prototype.trim = function() {

         return this.replace(/(^/s*)|(/s*$)/g, "");

     }

正则表达式“/(^/s*)|(/s*$)/g”包含:一对定界符“/”、全局匹配参数g、匹配字符串起始位置^、匹配空格/s、重复匹配0次或多次*、匹配字符串结束位置$、选择运算符|

解释:从字符串首(定界符^)开始,第一个括号(^/s*)匹配字符串开头的空白,0个或多个,用""替换;因为参数g的关系,继续匹配,第二次第二个括号(/s*$)匹配字符串结尾的空白,0个或多个,用""替换,结束(定界符$)。

3.常用正则表达式:

"^-[0-9]*[1-9][0-9]*$"  //负整数

"^-?/d+$"    //整数

"^/d+(/./d+)?$"  //非负浮点数(正浮点数 + 0

"^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数

"^((-/d+(/./d+)?)|(0+(/.0+)?))$"  //非正浮点数(负浮点数 + 0

"^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数

"^(-?/d+)(/./d+)?$"  //浮点数

"^[A-Za-z]+$"  //26个英文字母组成的字符串

"^[A-Z]+$"  //26个英文字母的大写组成的字符串

"^[a-z]+$"  //26个英文字母的小写组成的字符串

"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串

"^/w+$"  //由数字、26个英文字母或者下划线组成的字符串

"^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$"    //email地址

"^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$"  //url

4.最常用的6个方法(testexecmatchsearchreplacesplit

   1test检查指定的字符串是否存在

       var data = "123123";

       var reCat = /123/gi;

       alert(reCat.test(data));  //true

   2exec返回查询值

       var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

       var reCat = /cat/i;

       alert(reCat.exec(data));  //Cat

   3match得到查询数组

       var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

       var reCat = /cat/gi;

       var arrMactches = data.match(reCat)

       for (var i=0;i < arrMactches.length ; i++){

            alert(arrMactches[i]);   //Cat  cat

       }

   4search返回搜索位置,类似于indexof

       var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

       var reCat = /cat/gi;

       alert(data.search(reCat));  //23

    5replace替换字符串

       var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

       var reCat = /cat/gi;

       alert(data.replace(reCat,"libinqq"));

    6split分割字符串为数组

       var data = "123123,213,12312,312,3,Cat,cat,dsfsdfs,";

       var reCat = //,/;

       var arrdata = data.split(reCat);

       for (var i = 0; i < arrdata.length; i++){

            alert(arrdata[i]);

       }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值