正则表达式基本语法和正则表达式集

正则表达式

 

什么叫正则表达式? 

 

用来查找或者匹配一种模式,这种模式具有一定的特征,能够通过一些

语法描述出来。Email地址,IP地址,身份证号码,电话号码

 

如何定义正则表达式?


第一种定义方法
varreName = new RegExp("nowamagic");
varreName = newRegExp("nowamagic","i");//i=ignoreCase:忽略大小写 


第二种定义方法:
javascript中正则表达式的第二种定义方法(perl风格) perl=也是一个脚本语言
 
varreName = /nowamagic/;
varreName = /nowamagic/i;

 

正则表达式方法

常用的6种方法

test--RegExp的test方法用来测试字符串是否匹配给出的匹配模式,返回布尔值;

 

exec--RegExp的exec方法返回包含第一个匹配的数组或null;

 

match--String的match方法返回包含所有匹配子字符串的数组;

 

replace--String的replace方法完成string的替换操作,支持正则表达式;

 

search-- 与String的indexof方法类似,不同的是search支持正则表达式,而不仅仅是字符串;

 

split-- 按照一定规则拆分字符串并将子字符串存储到数组中的String方法。

 

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

       var data="123123";
       var reCat = /123/gi;
      alert(reCat.test(data)); //true
     
       //检查字符是否存在  g继续往下走  i 不区分大小写

   2) exec 返回查询值

       var data="123123,213,12312,312,3,Cat,cat,dsfsdfs,";
       var reCat = /cat/i;
      alert(reCat.exec(data)); //Cat

     3)match  得到查询数组

       var data="123123,213,12312,312,3,Cat,cat,dsfsdfs,";
       var reCat = /cat/gi;
       var arrMactches=data.match(reCat)

       for (var i=0;i        {
          alert(arrMactches[i]);   //Cat  cat
       }

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

         在本例中,我们将检索"W3School":

        

      输出:

        6


   说明:search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

    5) replace  替换字符  利用正则替换
       在本例中,我们将使用"W3School" 替换字符串中的"Microsoft":

        

      输出:

        Visit W3School!



    6)split   分割
      在本例中,我们将按照不同的方式来分割字符串:

        

      输出:

        How,are,you,doing,today?

        H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?

        How,are,you

 

元字符

在正则表达式中有一些特殊的字符符号我们是不能直接使用的,必须对其进行转义后才能使用。如“\”,因为这些字符在正则表达式中有特殊的语法含义,这类字符被称为元字符,正则表达式中的元字符有:

.,\,/,*,?,+,[,(,),],{,},^,$,|

可能不太好记忆,当无法确定某个字符是否是元字符的时候就勇敢的对其进行转义是没有错的,对不是元字符的字符进行转义是不会出什么问题的,但是如果不对元字符转义就会有意想不到的错误产生了。

 

在正则表达式中一些特定的字符集合可以使用一些特殊的元字符来代替:

特殊字符

\d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于[^0-9]
\w 任何一个字母数字或下划线字符,等价于[a-zA-Z_]
\W 任何一个非字母数字和下划线字符,等价于[^a-zA-Z_]
\s 任何一个空白字符,包括换页符、换行符、回车符、制表符和垂直制表符,等价于[\f\n\r\t\v]
\S 任何一个非空白字符,等价于[^\f\n\r\t\v]
. 换行和回车以外的任何单个字符,等价于[^\n\r]

r

查找非空白字符。

\b

匹配单词边界。

\B

匹配非单词边界。

\0

查找 NUL 字符。

\n

查找换行符。

\f

查找换页符。

\r

查找回车符。

\t

查找制表符。

\v

查找垂直制表符。

\xxx

查找以八进制数 xxx 规定的字符。

\xdd

查找以十六进制数 dd 规定的字符。

\uxxxx

查找以十六进制数 xxxx 规定的 Unicode 字符

 

量词

n+

匹配任何包含至少一个 n 的字符串。

n*

匹配任何包含零个或多个 n 的字符串。

n?

匹配任何包含零个或一个 n 的字符串。

n{X}

匹配包含 X 个 n 的序列的字符串。

n{X,Y}

匹配包含 X 或 Y 个 n 的序列的字符串。

n{X,}

匹配包含至少 X 个 n 的序列的字符串。

n$

匹配任何结尾为 n 的字符串。

^n

匹配任何开头为 n 的字符串。

?=n

匹配任何其后紧接指定字符串 n 的字符串。

?!n

匹配任何其后没有紧接指定字符串 n 的字符串。

 

重复匹配

以匹配一个email地址为例,[email protected]这样的一个email地址必须包括一个合法的用户名mymail,@符号以及一个合法的域。其中用户名和域名的字符个数都是无法判断的,但是有一点是肯定的——用户名必须至少是一个字符,域名至少是两个字符中间还必须有一个点号。于是我们可以这样做:

var reMail=/\w+@\w+\.\w+/i;

var email= "[email protected]";

document.write(reMail.test(email));//true

“+”表示字符出现一次或多次,至少出现一次。这个正则表达式其实并不能匹配所有合法的email地址,后面我们继续完善。

除了“+”可以指定至少匹配一次外,还有很多其他的可以指定匹配次数的方式。

  • ? 出现零次或一次,最多一次
  • * 出现任意次(零次、一次、多次)
  • + 出现一次或多次,至少一次
  • {n} 能且只能出现n次
  • {n,m} 至少出现n次,最多出现m次

 

防止过度匹配

有这样一段HTML文本:

1

var html = "nowamagicfor a simple lifehttp://nowamagic.net/";

如果现在要讲及其中间的文本匹配出来,正则表达式可以这样写:

1

var reEm1 = /.*<\/em>/gi;

2

document.write(html.match(reEm1));//"nowamagicfor a simple lifehttp://nowamagic.net/"

 

3

var reEm2 = /.*?<\/em>/gi;

4

document.write(html.match(reEm2));//nowamagic,http://nowamagic.net/

当使用贪婪模式的时候,”.*”会最大程度地进行字符匹配,所以输出了整个字符串。而在惰性模式中,”.*?”只进行最小限度的匹配,所以完整的输出了我们需要的字符串。

惰性模式的语法很简单,即是在贪婪模式后面加上一个“?”即可。

  • * –> *?
  • + –> +?
  • {n,} –> {n,}?

位置匹配

1

var s = “_Don’t do it!”;

如何将单词“do”匹配出来?it’s easy!

1

var reDo = /do/gi;

2

document.write(s.match(reDo));//Do,do

但是这个简单的正则表达式/do/gi将“don’t”中的“do”也进行了匹配,可这并不是想要的结果。而在正则表达式中有专门用来进行单词边界匹配的限定符”\b“。

1

var reDo = /\bdo\b/gi;

2

document.write(s.match(reDo));//do

“\b”到底匹配的什么呢?”\b”匹配的是一个位置,一个位于”\w“(字母,数字,下划线)和”\W“之间的位置。

既然有”\b”,那有”\B”吗?当然,他和”\b“刚好相反,由来匹配一个不是单词边界的位置。比如上例中匹配”don’t”中的”do”时”\B”就可派上用场。

1

var reDo = /\Bdo\B/gi;

2

document.write(s.match(reDo));//Do

在介绍取非匹配的时候介绍^只用位于[]并紧跟[方能取非匹配,而^还有另外一种用途——字符串边界匹配。

  • ^ 用来匹配字符串开头
  • $ 用来匹配字符串结尾

比如我们要匹配一个http://nowamagic.net形式的net域名:

1

var url = "http://nowamagic.net";

2

var reUrl = /^(http):\/\/nowamagic\.(net)$/gi;

 

3

document.write(reUrl.test(url));//true

正则表达式reUrl限制url必须以”http”开头,以”net”结尾。

又如经常被扩展的string方法trim:

1

function trim(s){

2

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

 

3

}

同时我们可以在整个模式的最前面使用(?m)来启用分行匹配模式。这样,^不但匹配正常的字符串开头,还将匹配行分隔符(换行符)后面的开始位置;$不仅匹配正常的字符串结尾,还将匹配行分隔符(换行符)后面的结束位置。

 

 

验证数字的正则表达式集 

验证数字:^[0-9]*$
验证n位的数字:^\d{n}$
验证至少n位数字:^\d{n,}$
验证m-n位的数字:^\d{m,n}$
验证零和非零开头的数字:^(0|[1-9][0-9]*)$
验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
验证非零的正整数:^\+?[1-9][0-9]*$
验证非零的负整数:^\-[1-9][0-9]*$
验证非负整数(正整数 + 0)  ^\d+$
验证非正整数(负整数 + 0) ^((-\d+)|(0+))$
验证长度为3的字符:^.{3}$
验证由26个英文字母组成的字符串:^[A-Za-z]+$
验证由26个大写英文字母组成的字符串:^[A-Z]+$
验证由26个小写英文字母组成的字符串:^[a-z]+$
验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
验证由数字、26个英文字母或者下划线组成的字符串:^\w+$
验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+
验证汉字:^[\u4e00-\u9fa5],{0,}$
验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$
验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。
验证身份证号(15位或18位数字):^\d{15}|\d{}18$
验证一年的12个月:^(0?[1-9]|1[0-2])$正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$  正确格式为:01、09和1、31。
整数:^-?\d+$
非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$
正浮点数  /^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/
非正浮点数(负浮点数 + 0)^((-\d+(\.\d+)?)|(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+)?

如果你是湖南的欢迎加入湖南人在深圳-Java群:557651502

 

 


你可能感兴趣的:(js)