JavaScript常用正则表达式汇总

来源:互联网 发布:javascript 改变class 编辑:程序博客网 时间:2024/05/19 06:48

一、正则表达式使用详解

简介

简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
     
替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
     
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

 

基本语法

在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。

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

/love/其中位于“/定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
     
较为常用的元字符包括:+*,以及?
     
+元字符规定其前导字符必须在目标对象中连续出现一次或多次。
     
*元字符规定其前导字符必须在目标对象中出现零次或连续多次。
     
?元字符规定其前导对象必须在目标对象中连续出现零次或一次。

 

二、正则表达式元字符的具体应用

/fo+/因为上述正则表达式中包含“+元字符,表示可以与目标对象中的fool,fo,或者football等在字母f后面连续出现一个或多个字母o的字符串相匹配。
    /eg*/因为上述正则表达式中包含“*元字符,表示可以与目标对象中的easy,ego,或者egg等在字母e后面连续出现零个或多个字母g的字符串相匹配。
    /Wil?/因为上述正则表达式中包含“?元字符,表示可以与目标对象中的Win,或者“Wilson,等在字母i后面连续出现零个或一个字母l的字符串相匹配。

 

有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

{n} n 是一个非负整数。匹配确定的 n次。例如,'o{2}'不能匹配"Bob"中的 'o',但是能匹配"food"中的两个 o
    {n,} n 是一个非负整数。至少匹配 n次。例如,'o{2,}'不能匹配"Bob"中的 'o',但能匹配"foooood"中的所有 o'o{1,}'等价于 'o+''o{0,}'则等价于 'o*'
    {n,m} m n均为非负整数,其中n <= m。最少匹配 n次且最多匹配 m次。例如,"o{1,3}"将匹配 "fooooood"中的前三个 o'o{0,1}'等价于 'o?'。请注意在逗号和两个数之间不能有空格。
    除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim{2,6}/上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmyjimmmmmy等字符串相匹配。

 

三、在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式

\s:用于匹配单个空格符,包括tab键和换行符;
      
\S:用于匹配除单个空格符之外的所有字符;
      
\d:用于匹配从09的数字;
      
\w:用于匹配字母,数字或下划线字符;
      
\W:用于匹配所有与\w不匹配的字符;
      
. :用于匹配除换行符之外的所有字符。

(说明:我们可以把\s\S以及\w\W看作互为逆运算)

下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。

/\s+/上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。

/\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。

 

除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。较为常用的定位符包括:^,$,\b以及\B

^定位符规定匹配模式必须出现在目标字符串的开头
    $定位符规定匹配模式必须出现在目标对象的结尾
    \b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
    \B定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,
即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。

同样,我们也可以把“^和“$以及“\b和“\B看作是互为逆运算的两组定位符。

举例来说:

 /^hell/ 因为上述正则表达式中包含“^定位符,所以可以与目标对象中以hell,hello或“hellhound开头的字符串相匹配。

/ar$/ 因为上述正则表达式中包含“$定位符,所以可以与目标对象中以car,barar结尾的字符串相匹配。

 /\bbom/ 因为上述正则表达式模式以“\b定位符开头,所以可以与目标对象中以bomb,bom开头的字符串相匹配。

/man\b/ 因为上述正则表达式模式以“\b定位符结尾,所以可以与目标对象中以human,womanman结尾的字符串相匹配。

为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:
    /[A-Z]/上述正则表达式将会与从AZ范围内任何一个大写字母相匹配。
    /[a-z]/上述正则表达式将会与从az范围内任何一个小写字母相匹配。
    /[0-9]/  上述正则表达式将会与从09范围内任何一个数字相匹配。
    /([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如aB0等相匹配。

这里需要提醒用户注意的一点就是可以在正则表达式中使用()把字符串组合在一起。“()符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如abc等的字符串匹配,因为“abc中的最后一个字符为字母而非数字。

 

如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符|。例如:/to|too|2/ 上述正则表达式将会与目标对象中的to,too,2相匹配。
  正则表达式中还有一个较为常用的运算符,即否定符[^]。与我们前文所介绍的定位符^不同,否定符[^]规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/ 上述字符串将会与目标对象中除AB,和C之外的任何字符相匹配。一般来说,当“^出现在[]内时就被视做否定运算符;而当“^位于“[]之外,或没有“[]时,则应当被视做定位符。

最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\。例如:/Th\*/ 上述正则表达式将会与目标对象中的“Th*而非“The等相匹配。

 

在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先级顺序来求值。优先级如下:

1.\转义符
2.(), (?:), (?=), []
圆括号和方括号
3.*, +, ?, {n}, {n,}, {n,m}
限定符
4.^, $, \anymetacharacter
位置和顺序
5. |
等于“或”操作

 

使用实例

JavaScript 1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回truefalse

 

正则表达式对象
  本对象包含正则表达式模式以及表明如何应用模式的标志。
  语法 1 re = /pattern/[flags]
  语法 2 re = new RegExp("pattern",["flags"])
  参数
re
  必选项。将要赋值为正则表达式模式的变量名。
Pattern
  必选项。要使用的正则表达式模式。如果使用语法 1,用"/"字符分隔模式。如果用语法 2,用引号将模式引起来。
Flags
  可选项。如果使用语法 2要用引号将 flag引起来。

标志可以组合使用,可用的有:
g (全文查找出现的所有 pattern)
i (忽略大小写)
m (多行查找)

示例

  下面的示例创建一个包含正则表达式模式及相关标志的对象(re),向您演示正则表达式对象的用法。在本例中,作为结果的正则表达式对象又用于 match 方法中:


function MatchDemo(){  var r, re; // 声明变量。  var s = "The rain in Spain falls mainly in the plain";  re = new RegExp("ain","g"); // 创建正则表达式对象。  r = s.match(re); // 在字符串 s 中查找匹配。  return(r);}

下面是具体的使用:
方法一:
varre=/正则表达式/;
re.test($("txtid").val())

方法二:
$("txtid").val.match(/正则表达式/)

 

附:
验证数字的正则表达式集(转载)
验证数字:^[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-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXX
验证身份证号(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)$正确格式为:0109131
整数:^-?\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+)?

 

下面是具体的函数写法,不会的可以参考下。

// 返回字符串的实际长度, 一个汉字算2个长度

functionstrlen(str){

  return str.replace(/[^\x00-\xff]/g,"**").length;

}

 

 

//匹配中国邮政编码(6)

functionispostcode(str) {

  var result=str.match(/[1-9]\d{5}(?!\d)/);

  if(result==null) return false;

  return true;

}

//匹配国内电话号码(0511-4405222 021-87888822)

functionistell(str) {

  var result=str.match(/\d{3}-\d{8}|\d{4}-\d{7}/);

  if(result==null) return false;

  return true;

}

 

//校验是否为(0-10000)的整数

functionisint1(str) {

  varresult=str.match(/^[0-9]$|^([1-9])([0-9]){0,3}$|^10000$/);

  if(result==null) return false;

  return true;

}

 

 

//匹配腾讯QQ

functionisqq(str) {

  var result=str.match(/[1-9][0-9]{4,}/);

  if(result==null) return false;

  return true;

}

 

 

//匹配身份证(15位或18)

functionisidcard(str) {

  var result=str.match(/\d{15}|\d{18}/);

  if(result==null) return false;

  return true;

}// 判断输入是否是一个由 0-9 / A-Z / a-z 组成的字符串 function isalphanumber(str) { var result=str.match(/^[a-zA-Z0-9]+$/); if(result==null) return false; return true; } // 判断输入是否是一个数字--(数字包含小数)-- function isnumber(str) { return !isNaN(str); } // 判断输入是否是一个整数 function isint(str) { var result=str.match(/^(-|\+)?\d+$/); if(result==null) return false; return true; } // 判断输入是否是有效的电子邮件 function isemail(str) { var result=str.match(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/); if(result==null) return false; return true; } // 去除字符串的首尾的空格 function trim(str){ return str.replace(/(^\s*)|(\s*$)/g, ""); }  


中国电话号码验证

匹配形式如:0511-4405222或者021-87888822或者 021-44055520-555或者(0511)4405222

正则表达式"((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*"

 

中国邮政编码验证

匹配形式如:215421

正则表达式"d{6}"

 

电子邮件验证

匹配形式如:justali@justdn.com

正则表达式"w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"

 

身份证验证

匹配形式如:15位或者18位身份证

正则表达式"d{18}|d{15}"

 

常用数字验证

正则表达式

"d{n}"n为规定长度

"d{n,m}"nm的长度范围

 

非法字符验证

匹配非法字符如:< >& / ' |

正则表达式[^<>&/|'\]+

 

日期验证

匹配形式如:20030718,030718

范围:1900--2099

正则表达式((((19){1}|(20){1})d{2})|d{2})[01]{1}d{1}[0-3]{1}d{1}

 

 

匹配中文字符的正则表达式:[\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

 

匹配双字节字符(包括汉字在内)[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计1

 

匹配空白行的正则表达式:\n\s*\r

评注:可以用来删除空白行



匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|< .*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

 

匹配首尾空白字符的正则表达式:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

 

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用

 

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

 

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

 

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

评注:匹配形式如0511-4405222 021-87888822

 

匹配腾讯QQ号:[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始

 

匹配中国邮政编码:[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字

 

匹配身份证:\d{15}|\d{18}

评注:中国的身份证为15位或18

 

匹配ip地址:\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用

 

提取信息中的ip地址:

(\d+)\.(\d+)\.(\d+)\.(\d+)

 

提取信息中的中国手机号码:

(86)*0*13\d{9}

 

提取信息中的中国固定电话号码:

(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}


提取信息中的中国电话号码(包括移动和固定电话):

(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}

 

提取信息中的中国邮政编码:

[1-9]{1}(\d+){5}

 

提取信息中的中国身份证号码:

\d{18}|\d{15}

 

提取信息中的整数:

\d+

 

提取信息中的浮点数(即小数):

(-?\d*)\.?\d+

 

提取信息中的任何数字

(-?\d*)(\.\d+)?

 

提取信息中的中文字符串:

[\u4e00-\u9fa5]*

 

提取信息中的双字节字符串 (汉字)

[^\x00-\xff]*

 

提取信息中的英文字符串:

\w*

提取信息中的网络链接:

(h|H)(r|R)(e|E)(f|F)*= *('|")?(\w|\\|\/|\.)+('|"| *|>)?

 

提取信息中的邮件地址:

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

 

提取信息中的图片链接:

(s|S)(r|R)(c|C)*= *('|")?(\w|\\|\/|\.)+('|"| *|>)?

 

 

匹配特定数字:

^[1-9]\d*$ //匹配正整数

^-[1-9]\d*$ //匹配负整数

^-?[1-9]\d*$ //匹配整数

^[1-9]\d*|0$ //匹配非负整数(正整数 + 0

^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$//匹配非正浮点数(负浮点数 + 0

评注:处理大量数据时有用,具体应用时注意修正

 

匹配特定字符串:

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

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

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

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

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

评注:最基本也是最常用的一些表达式



文章为多数人编写,请尊重原创


原创粉丝点击