超全的js正则表达式整理笔记

var reCat = new RegExp("cat", "gi"); //RegExp构造函数可以带一个或两个参数,第一个参数描述需要进行匹配的模式字符串,第二个参数指定了额外的处理命令
var reCat = /cat/gi; //使用Perl风格的语法 

 i:执行对大小写不敏感的匹配
 g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
 m:执行多行匹配

元字符 

元字符是表达式语法的一部分,在正则表达式中用到的所有元字符有:{ [ ( \ ^ $ | ) ] } ? * + - 
如匹配一个问号:var reQMark = /\?/; 或 var reQMark = new RegExp("\\?"); //注意这里是两个反斜杠,双重转义

\xxx 查找以八进制数 xxx 规定的字符,如:/\142/为字符b
\xdd 查找以十六进制数 dd 规定的字符,如:/\x62/为字符b
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符,如:/\u0062/为字符b
\r 查找回车符
\n 查找换行符
\f 查找换页符
\t 查找制表符
\v 查找垂直制表符
\a 查找alert字符
\e 查找escape字符
\cX 查找与X相对应的控制字符
\0 查找 NULL 字符 

. 查找单个字符,除了换行和行结束符,等同于[^\n\r]
\w 查找单词字符,等同于[a-zA-Z_0-9]
\W 查找非单词字符,等同于[^a-zA-Z_0-9]
\d 查找数字,等同于[0-9]
\D 查找非数字字符,等同于[^0-9]
\s 查找空白字符,等同于[ \t\n\x0B\f\r],\x0B为垂直tab和\t一样
\S 查找非空白字符,等同于[^ \t\n\x0B\f\r]

方括号 

[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符
[0-9] 查找任何从 0 至 9 的数字
[a-z] 查找任何从小写 a 到小写 z 的字符
[A-Z] 查找任何从大写 A 到大写 Z 的字符
[A-z] 查找任何从大写 A 到小写 z 的字符
[adgk] 查找给定集合内的任何字符
[^adgk] 查找给定集合外的任何字符

量词 
? 匹配任何包含零个或一个的字符串,如:ba?d匹配bd、bad 
+ 匹配任何包含至少一个的字符串,如:ba+d匹配bad、baad 
* 匹配任何包含零个或多个的字符串,如:ba*d匹配bd、bad、baad 
{n} 匹配包含恰好出现n次的序列的字符串,如:ba{1}d匹配bad 
{n,m} 匹配包含至少n次但不超过m次 的序列的字符串,如:ba{0,1}d匹配bd、bad 
{n,} 匹配包含至少出现n次的序列的字符串,如:ba{0,}匹配bd、bad、baad、baaad   
贪婪量词:先看整个的字符串是否匹配,如果发现没有匹配,去年该字符串中的最后一个字符并再次尝试,如:?、+、*、{n}、{n, m}、{n, },默认就为贪婪量词 
惰性量词:先看字符串中的第一个字母是否匹配,如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串,与贪婪量词的工作方式恰好相反,如:??、+?、*?、{n}?、{n, m}?、{n, }? 
支配量词:只尝试匹配整个字符串,如果整个字符串不能产生匹配,不做进一步尝试,如:?+、++、*+、{n}+、{n, m}+、{n, }+

var sToMatch = "abbbaabbbaaabbb1234";
var re1 = /.*bbb/g; //匹配结果为"abbbaabbbaaabbb"
var re2 = /.*?bbb/g; //只有惰性量词才能匹配成功,匹配结果为"abbb","aabbb","aaabbb"
var re3 = /.*+bbb/g; //匹配不了,直接报错

复杂模式之分组:通过一系列括号包围一系列字符、字符类以及量词来使用的 
/(dog){2}/  匹配"dogdog" 
/([bd]ad?)*/  匹配空, "ba", "da", "bad", "dad" 
/(mom( and dad)?)/  匹配"mom", "mom and dad" 
/^\s*(.*?)\s+$/  匹配首尾的空白字符,也可以用/^\s+|\s+$/g 
复杂模式之反向引用:也叫捕获性分组,按照从左到右遇到的左括号字符的顺序进行创建和编号的,例如表达式(A?(B?(C?)))将产生编号从1-3的三个反向引用:(A?(B?(C?)))、(B?(C?))、(C?) 
反向引用有几种不同的使用方法: 
首先,使用正则表达式对象的test()、match()或search()方法后,反向引用的值可以从RegExp构造函数中获得,如:

var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1); //"123456789",$1保存了第一个反向引用,依次可以用$2,$3...

然后,可以直接在定义分组的表达式中包含反向引用,通过使用特殊转义序列如\1、\2等实现

var sToMatch = "dogdog";
var reDogdog = /(dog)\1/; //等同于/dogdog/
alert(reDogdog.test(sToMatch)); //true

第三,反向引用可以用在String对象的replace()方法中,通过使用特殊字符序列如$1、$2等实现

var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/;
alert(sToChange.replace(reMatch, "$2 $1")); //"5678 1234"

复杂模式之候选:使用管道符(|)放在两个单独的模式之间

var reBadWords = /badword | anotherbadword/gi;
var sUserInput = "This is a String using badword1 and badword2.";
var sFinalText = sUserInput.replace(reBadWords, function(sMatch){
 return sMatch.replace(/./g, "*"); //用星号替换敏感词中的每一个字母
});

复杂模式之非捕获性分组:相比捕获性分组,不会创建反向引用,在较长的正则表达式中,存储反向引用会降低匹配速度,通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销

var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/; //只需要在左括号的后面加上一个问号和一个紧跟的冒号就可创建一个非捕获性分组
reNumbers.test(sToMatch);
alert(RegExp.$1); //"",输出空字符串是因为该分组是非捕获性的
alert(sToMatch.replace(reNumbers, "abcd$1")); //输出结果是"abcd$1"而不是"abcd123456789",不能使用任何反向引用

又如:

String.prototype.stripHTML = function(){
 var reTag = /<(?:.|\s)*?>/g; //匹配所有的HTML标签,防止插入恶意HTML代码
 return this.replace(reTag, "");
}

复杂模式之前瞻:告诉正则表达式运算器向前看一些字符而不移动其位置,存在正向前瞻(检查接下来出现的是不是某个特定字符集)和负向前瞻(检查接下来的不应该出现的特定字符集) 
正向前瞻(?=n) 匹配任何其后紧接指定字符串 n 的但不包括 n的字符串,注意这里的括号不是分组 
负向前瞻(?!n) 匹配任何其后没有紧接指定字符串 n 的字符串,如:

var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed1 = /(bed(?=room))/;
var reBed2 = /(bed(?!room))/;
alert(reBed1.test(sToMatch1)); //true
alert(RegExt.$1); //输出"bed"而不是"bedroom"
alert(reBed1.test(sToMatch2)); //false
alert(reBed2.test(sToMatch1)); //false
alert(reBed2.test(sToMatch2)); //true
alert(RegExt.$1); //输出的也是"bed"

复杂模式之边界:用于正则表达式中表示模式的位置 
n$ 匹配任何结尾为 n 的字符串,如:/(\w+)\.$/匹配行尾单词"one.","two."等 
^n 匹配任何开头为 n 的字符串,如:/^(.+?)\b/匹配起始位置后的一个或多个单词字符 
\b 查找位于单词的开头或结尾的匹配,如:/\b(\S+?)\b/g 或 /(\w+)/g匹配从字符串中抽取单词 
\B 查找不处在单词的开头或结尾的匹配 
复杂模式之多行模式: 

var sToMatch = "First second\nthird fourth\nfifth sixth";
var reLastWordOnLine = /(\w+)$/gm;
alert(sToMatch.match(reLastWordOnLine)); //输出["second", "fourth", "sixth"]而不只是"sixth"

RegExp对象的属性和方法: 
global  //RegExp 对象是否具有标志 g 
ignoreCase  //RegExp 对象是否具有标志 i 
multiline  //RegExp 对象是否具有标志 m 
source  //正则表达式的源文本 
lastIndex  //一个整数,标示下一次匹配钭会从哪个字符位置开始(只有当使用exec()和test()函数才会填入,否则为0) 
真正使用到的是lastIndex,如:


var sToMatch = "bbq is short for barbecue";
var reB = /b/g;
reB.exec(sToMatch);
alert(reB.lastIndex); //1,匹配位置是0,lastIndex为1
reB.exec(sToMatch);
alert(reB.lastIndex); //2
reB.exec(sToMatch);
alert(reB.lastIndex); //18
reB.lastIndex = 0; //重头开始匹配
reB.exec(sToMatch);
alert(reB.lastIndex); //1而不是21

静态属性 
input,短名为$_,最后用于匹配的字符串(传递给exec()或test()的字符串) 
leftContext,短名为$^,在上次匹配的前面的子串 
rightContext,短名为$^,在上次匹配之后的子串 
lastMatch,短名为$&,最后匹配的字符 
lastParen,短名为$+,最后匹配的分组 
multiline,短名为$*,用于指定是否所有的表达式都使用多行模式的布尔值,不同于其它属性,不依赖最后一次执行的匹配,它可以设置所有的正则表达式的m选项,RegExp.multiline = "true";,注意IE和Opera不运行它

 var sToMatch = "this has been a short, short summer";
 var reShort = /(s)hort/g;
 reShort.test(sToMatch);
 alert(RegExg.input); //"this has been a short, short summer";
 alert(RegExg.leftContext); //"this has been a ";
 alert(RegExg.rightContext); //", short summer";
 alert(RegExg.lastMatch); //"short"
 alert(RegExg.lastParen); //"s" 

compile() //编译正则表达式
alert(reCat.exec("a cat, a Cat, a cAt caT")); //返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用
alert(reCat.test("cat")); //true,检索字符串中指定的值,返回 true 或 false。

支持正则表达式的String对象的方法 

var sToMatch = "a bat, a Cat, a fAt, a faT cat";
var reAt = /at/gi;
alert(sToMatch.match(reAt)); //返回一个包含在字符串中的所有匹配的数组
alert(sToMatch.search(reAt)); //输出第一次在字符串中出现的位置3,全局匹配g在search()时不起作用
alert(sToMatch.replace(reAt, "Dog")); //替换与正则表达式匹配的子串
alert(sToMatch.replace(reAt, function(sMatch){
 return "Dog";
}));
alert(sToMatch.split(/\,/)); //把字符串分割为字符串数组

常用模式 
日期:/(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20\d{2})/ 
URL:/^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$/ 
E-mail地址:/^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$/ 
国内电话号码:d{3}-d{8}|d{4}-d{7} 
腾讯QQ号:[1-9][0-9]{4,} 
邮政编码:[1-9]d{5}(?!d) 
身份证:d{15}|d{18} 
ip地址:d+.d+.d+.d+ 
中文字符: [u4e00-u9fa5] 
双字节字符(包括汉字在内):[^x00-xff] 
    String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 
全角字符:/[^uFF00-uFFFF]/g 
匹配特定数字: 

^[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) 

是不是很全面,很详细,感觉不错的就把这文章好好收藏,js正则表达式很重要的学习环节,大家一定好好学习。

(0)

相关推荐

  • PHP中过滤常用标签的正则表达式

    我们常常会用到PHP过滤一些标签的功能,比如过滤链接标签.过滤script标签等等,下面就介绍一下PHP过滤常用标签的正则表达式代码: $str=preg_replace("/\s+/", " ", $str); //过滤多余回车 $str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格) $str=preg_replace

  • 最全最实用的正则表达式大全分享

    正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 一.校验数字的表达式 1 数字:^[0-9]*$  2 n位的数字:^\d{n}$  3 至少n位的数字:^\d{n,}$  4 m-n位的数字:^\d{m,n}$  5 零和非零开头的数字:^(0|

  • js用正则表达式来验证表单(比较齐全的资源)

    在学习网页中的表单验证,顺便学习下正则表达式 在网上找了后发现了一个比较齐全的资源,稍微进行了一下排版 复制代码 代码如下: // 检查是否为有效的真实姓名,只能含有中文或大写的英文字母 function isValidTrueName(strName){ var str = Trim(strName); //判断是否为全英文大写或全中文,可以包含空格 var reg = /^[A-Z u4E00-u9FA5]+$/; if(reg.test(str)){ return false; } ret

  • python正则表达式判断字符串是否是全部小写示例

    复制代码 代码如下: # -*- coding: cp936 -*-import re  s1 = 'adkkdk's2 = 'abc123efg' an = re.search('^[a-z]+$', s1)if an:    print 's1:', an.group(), '全为小写' else:    print s1, "不全是小写!" an = re.match('[a-z]+$', s2)if an:    print 's2:', an.group(), '全为小写'

  • 最全的常用正则表达式大全

    很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,包括校验数字.字符.一些特殊的需求等等.给自己留个底,也给朋友们做个参考. 一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9

  • 常用的正则表达式集锦

    在计算机科学中,正则表达式用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在WEB开发中,正则表达式通常用来检测.查找替换某些符合规则的字符串,如检测用户输入E-mai格式是否正确,采集符合规则的页面内容等等. 今天我将分别用PHP和Javascript向大家介绍WEB开发中最常用最实用的正则表达式及其用法,正则表达式是一门学科,不可能使用一篇文章来讲解完,理论的东西网上很多,有兴趣的同学可以搜一大把.不过你也许没必要去埋头学习琢磨不透的正则表达式,看本文和实例给您呈现常用.实用的正

  • C#正则表达式分解和转换IP地址实例(C#正则表达式大全 c#正则表达式语法)

    只能输入数字:"^[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

  • js正则表达式验证大全(收集)

    引用网址  http://hi.baidu.com/quiteuniverse/blog/item/9f3f043d46ad1e07bba16716.html 以下函数调用方式: function check() { var bb = document.getElementById("txt_id").value;//txt_id为文本框的ID alert(ismobile(bb));//ismobile 代表以下任何一个函数名称 } HTML代码:   <input type=

  • JavaScript中常用的正则表达式日常整理(全)

    //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return false return true } 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注

  • 比较常用证件正则表达式验证大全

    下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多.特发出来,让各位朋友共同使用. // 身份证验证   jQuery.validator.addMethod("isIdCard", function(value, element, type) { if ($(type).val() === '1') { var re = /(^/d{15}$)|(^/d{18}$)|(^/d{17}(/d|X|x)$)/; return this.optional(

随机推荐