常用正则表达式收藏

来源:互联网 发布:怎样用手机申请淘宝号 编辑:程序博客网 时间:2024/04/29 03:42

javascript 正则表达式实战(1)
2009年05月24日 星期日 16:50


匹配结尾的数字
统一空格个数
判断字符串是不是由数字组成
电话号码正则
手机号码正则表达式
使用正则表达式实现删除字符串中的空格
限制文本框只能输入数字和小数点等等
替换小数点前内容为指定内容
只匹配中文的正则表达式
返回字符串的中文字符个数
正则表达式取得匹配IP地址前三段
匹配<ul>与<ul>之间的内容
用正则表达式获得文件名
绝对路径变相对路径
用户名正则
匹配英文地址
正则匹配价格
身份证号码的匹配
要求文本有指定行数
单词首字母大写
正则验证日期格式
去掉文件的后缀名
验证邮箱的正则表达式
匹配源代码中的链接
匹配链接的文字
正则判断标签是否闭合
用正则获得指定标签的内容
正则判断是否为数字与字母的混合
空格与英文同时存在
显示或者保存正则表达式匹配的部分内容
正则表达式替换变量
正则替换指定属性中的文本
将阿拉伯数字替换为中文大写形式
替换文本中的URL为链接
从HTML代码段删除指定标签极其内容
用正则给文本分段
转换源代码中的标签
给属性添加双引号
给table加上tbody
去掉标签的所有属性
正则替换特定单词
指定文字高亮显示
删除标签
错误贴
太难贴
匹配数字的“正则”
正则资源


关于测试代码

本文不是使用Dreamweaver编辑,以下测试代码可能已经在赋值粘贴的过程做了一些调整,可能执行失效。可以参看本文的pdf版本。


匹配结尾的数字

来源:如何用 javascript 正则表达式 取出字符串最后一组数字,谢谢


30CAC0040 取出40
3SFASDF92 取出92

正则如下://d+$/g

统一空格个数

来源:正则匹配空格的问题

字符串内字符键有空格,但是空格的数量可能不一致,通过正则将空格的个数统一变为一个。

例如:蓝 色 理     想

变成:蓝 色 理 想

aobert的正则:

<script type="text/javascript">  var str="蓝 色 理 想"  var reg=//s+/g  str = str.replace(reg," ")  document.write(str)  </script>

判断字符串是不是由数字组成

来源:有没有简单的方法判断字符串由数字组成?

这个正则比较简单,写了一个测试

<script type="text/javascript">  function isDigit(str){   var reg = /^/d*$/;   return reg.test(str);  }  var str = "7654321";  document.write(isDigit(str));  var str = "test";  document.write(isDigit(str));  </script>

电话号码正则

来源:想问一下关于电话号码的正则判断

:求一个验证电话号码的JS正则

/^/d{3,4}-/d{7,8}(-/d{3,4})?$/

区号必填为3-4位的数字,区号之后用“-”与电话号码连接

^/d{3,4}-

电话号码为7-8位的数字

/d{7,8}

分机号码为3-4位的数字,非必填,但若填写则以“-”与电话号码相连接

(-/d{3,4})?

手机号码正则表达式

正则验证手机号,忽略前面的0,支持130-139,150-159。忽略前面0之后判断它是11位的。

cloeft的正则:

/^0*(13|15)/d{9}$/

^0*匹配掉开头任意数量的0。

由于手机号码是13任意数字9位,和15任意数字9位,所以可以用(13|15)/d{9}匹配。

测试代码如下:

function testReg(reg,str){   return reg.test(str);  }  var reg = /^0*(13|15)/d{9}$/;  var str = '13889294444';  var str2 = '12889293333';  var str3 = '23445567';  document.write(testReg(reg,str)+'<br />');  document.write(testReg(reg,str2)+'<br />');  document.write(testReg(reg,str3)+'<br />');

使用正则表达式实现删除字符串中的空格:

来源:请问js中有没有去掉空格的函数

代码以及测试代码如下:

<script type="text/javascript">  //删除字符串两侧的空白字符。  function trim(str){   return str.replace(/^/s+|/s+$/g,'');  }  //删除字符串左侧的空白字符。  function ltrim(str){   return str.replace(/^/s+/g,'');  }  //删除字符串右侧的空白字符。  function rtrim(str){   return str.replace(//s+$/g,'');  }  //以下为测试代码  var trimTest = " 123456789 ";//前后各有一个空格。  document.write('length:'+trimTest.length+'<br />');//使用前  document.write('ltrim length:'+ltrim(trimTest).length+'<br />');//使用ltrim后  document.write('rtrim length:'+rtrim(trimTest).length+'<br />');//使用rtrim后  document.write('trim length:'+trim(trimTest).length+'<br />');//使用trim后  </script>

测试的结果如下:

length:11 ltrim length:10 rtrim length:10 trim length:9

限制文本框只能输入数字和小数点等等

来源:文本框输入限制的问题????

只能输入数字和小数点

var reg = /^/d*/.?/d{0,2}$/

开头有若干个数字,中间有0个或者一个小数点,结尾有0到2个数字。

只能输入小写的英文字母和小数点,和冒号,正反斜杠(:.//)

var reg = /[a-z/.////:]+/;

a-z包括了小写的英文字母,/.是小数点,//和//分别是左右反斜线,最后是冒号。整个组成一个字符集和代码任一均可,最后在加上+,1或者多个。


替换小数点前内容为指定内容

来源:求一正则表达式!

请问 怎么把这个字符串的小数点前面的字符替换为我自定义的字符串啊?
例如:infomarket.php?id=197 替换为 test.php?id=197
应该可以把第一个点“.”之前的所有单词字符替换为test就可以了。我写的正则如下:

<script type="text/javascript">  var str = "infomarket.php?id=197";  var reg = /^/w*/ig;  //匹配字符串开头的任意个单词字符  str = str.replace(reg,'test');  document.write(str);  </script>

原帖的有点复杂,没太看明白。


只匹配中文的正则表达式

来源:关于上传的时候,只能选择中文名称的图片(是否可以用toASCII方法呢?)

前两天看的《JavaScript开发王》里恰好有中文的unicode范围,正则如下:

/[/一-/龥/?-/?]/

写了一个简单的测试,会把所有的中文替换成“哦”。

<script type="text/javascript">  var str = "有中文?and English.";  var reg = /[/一-/龥/?-/?]/ig;  str = str.replace(reg,'哦');  document.write(str);  </script>

返回字符串的中文字符个数

来源:有没返回中文字符字节的函数!

一般的字符长度对中文和英文都是不分别的 如JS里的length,那么如何返回字符串中中文字符的个数呢?guosh ng老师在原帖中给出了解决方案,我又没看懂……

不过我自己也想到了一个办法:先去掉非中文字符,再返回length属性。函数以及测试代码如下:

<script type="text/javascript">  function cLength(str){   var reg = /[^/一-/龥/?-/?]/g;   //匹配非中文的正则表达式   var temp = str.replace(reg,'');   return temp.length;  }  var str = "中文123";  document.write(str.length+'<br />');  document.write(cLength(str));  </script>

结果:

5 2

中文两个,数字三个,正确。

下面的测试也正确。

var str = "中文123tets@#!#%$#[][{}";  document.write(str.length+'<br />');  document.write(cLength(str));

正则表达式取得匹配IP地址前三段

来源:如何用正则取IP前3段

192.168.118.101,192.168.118.72, 192.168.118.1都替换成:192.168.118

只要匹配掉最后一段并且替换为空字符串就行了,正则如下:

//./d{1,3}$/

匹配结尾的.n,.nn或者.nnn。

测试代码如下:

function replaceReg(reg,str){   return str.replace(reg,'')  }  var reg = //./d{1,3}$/;  var str = '192.168.118.101';  var str2 = '192.168.118.72';  var str3 = '192.168.118.1';  document.write(replaceReg(reg,str)+'<br />');  document.write(replaceReg(reg,str2)+'<br />');  document.write(replaceReg(reg,str3)+'<br />');

相似的有,这个帖子里有一个验证IP地址的方法:求检验MAC地址的正则表达例子


匹配<ul>与<ul>之间的内容

来源:请教个正则的小问题吧
<ul>safsf<ul>safsf</ul><ul>safsf</ul></ul>

用正则可以得到 <ul>起到下个<ul> 之间的内容。

正则如下:

/<ul>[/s/S]+?<ul>/i

首先匹配两侧的ul标签,中间的[/s/S]+?可以匹配一个或者多个任意字符,一定要非贪婪,否则会匹配<ul>safsf<ul>safsf</ul><ul>。


用正则表达式获得文件名

来源:C:/006.jpg

c:/images/tupian/006.jpg

可能是直接在盘符根目录下,也可能在好几层目录下,要求替换到只剩文件名。

xlez的正则如下:

/[^////]*[////]+/g

首先匹配非左右斜线字符0或多个,然后是左右斜线一个或者多个。形如“xxx/”或者“xxx/”或者“/”或者“/”

函数以及测试代码:

<script type="text/javascript">  function getFileName(str){   var reg = /[^////]*[////]+/g;   //xxx/或者是xxx/   str = str.replace(reg,'');   return str;  }  var str = "c://images//tupian//006.jpg";  document.write(getFileName(str)+'<br />');  var str2 = "c:/images/tupian/test2.jpg";  document.write(getFileName(str2));  </script>

注意,/需要转义。


绝对路径变相对路径

来源:讨论一个正则

将<IMG height="120" width="800" src="http://23.123.22.12/image/somepic.gif">转换为:<IMG height="120" width="800" src="/image/somepic.gif">。

其中网址可能改变,例如http://localhost等等。

clo?hen的正则:

/http:////[^//]+/

首先是http://,然后[^//]+找过1个或者多个非/字符,因为遇到第一个/表示已经到目录了,停止匹配。

测试代码如下:

<script type="text/javascript">  var str = '<IMG height="120" width="800" /
src="http://23.123.22.12/image/somepic.gif">'; var reg = /http:////[^//]+/; str = str.replace(reg,""); alert(str) </script>

用户名正则

来源:求正则,急急呀!!

用于用户名注册,,用户名只 能用 中文、英文、数字、下划线、4-16个字符。

hansir和解决方案弄成正则:

/^[/一-/龥/?-/?/w]{4,16}$/

中文字符或者单词字符,4到16个。实现4到16结成到正则里的关键就是开始^和结束$,这就等于整个字符串只能有这些匹配的内容,不能有多余的。

函数和测试代码如下:

<script type="text/javascript">  function isEmail(str){   var reg = /^[/一-/龥/?-/?/w]{4,16}$/;    return reg.test(str);  }  var str = '超级无敌用户名regExp';  var str2 = '捣乱的@';  var str3 = '太短'  var str4 = '太长longlonglonglonglonglonglonglong'  document.write(isEmail(str)+'<br />');  document.write(isEmail(str2)+'<br />');  document.write(isEmail(str3)+'<br />');  document.write(isEmail(str4)+'<br />');  </script>

匹配英文地址

来源:-求助- 正则问题

规则如下:
包含 "点", "字母","空格","逗号","数字",但开头和结尾不能是除字母外任何字符。

[/.a-zA-Z/s,0-9]这个字符集就实现了字母,空格,逗号和数字。最终正则如下:

/^[a-zA-Z][/.a-zA-Z/s,0-9]*?[a-zA-Z]+$/

开头必须有字母,结束也必须是一个以上字母。测试代码如下:

<script type="text/javascript">  function testReg(reg,str){   return reg.test(str);  }  var reg = /^[a-zA-Z][/.a-zA-Z/s,0-9]*?[a-zA-Z]+$/;  var str = 'No.8,ChangAn Street,BeiJing,China';  var str2 = '8.No,ChangAn Street,BeiJing,China';  var str3 = 'No.8,ChangAn Street,BeiJing,China88';  document.write(testReg(reg,str)+'<br />')  document.write(testReg(reg,str2)+'<br />')  document.write(testReg(reg,str3)+'<br />')  </script>

正则匹配价格

来源:为什么这个正则不起作用啊?急啊?

价格的格式应该如下:

开头数字若干位,可能有一个小数点,小数点后面可以有两位数字。hansir给出的对应正则如下:

/^(/d*/./d{0,2}|/d+).*$/

hansir给出的测试代码如下:

<!DOCTYPE html PLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript"> function checkPrice(me){ if(!(/^(?:/d+|/d+/./d{0,2})$/.test(me.val))){ me.val = me.val.replace(/^(/d*/./d{0,2}|/d+).*$/,'$1'); } } </script> </head> <body> <input type="text" onkeyup="checkPrice(this);"/> </body> </html>

身份证号码的匹配

来源:关于正则的,大家帮帮忙,急,在线等

身份证号码可以是15位或者是18位,其中最后一位可以是X。其它全是数字,正则如下:

/^(/d{14}|/d{17})(/d|[xX])$/

开头是14位或者17位数字,结尾可以是数字或者是x或者是X。

测试代码如下:

<script type="text/javascript">  function testReg(reg,str){   return reg.test(str);  }  var reg = /^(/d{14}|/d{17})(/d|[xX])$/;  var str = '123456789012345';//15位  var str2 = '123456789012345678';//18位  var str3 = '12345678901234567X';//最后一位是X  var str4 = '1234';//位数不对  document.write(testReg(reg,str)+'<br />');  document.write(testReg(reg,str2)+'<br />');  document.write(testReg(reg,str3)+'<br />');  document.write(testReg(reg,str4)+'<br />');  </script>

要求文本有指定行数

来源:[求助]求一句正则表达式的写法

匹配至少两行的字符串,每行都为非空字符。

只要匹配到[/n/r]就表示有换行了,再保证换行的两段都不是空字符就可以了。正则如下:

//S+?[/n/r]/S+?/i

这个正则的应用应该是用在textarea里,如果是如下要求:可以支持所有字符,中间可带空格,可以包括英文、数字、中文、标点

这样的话,只要针对空格再改一下就行了。(按照非空的要求,上面有不能匹配“字符+空格+换行+字符”的字符串)。修改如下:

//S+?/s*?[/n/r]/s*?/S+?/i

单词首字母大写

来源:求个正则,处理英文单词或词组的

每单词首字大写,其他小写。如bl idea转换为Bl Idea,BL IDEA也转换为Bl Idea

cloeft的正则:

//b(/w)|/s(/w)/g

所谓“首字母”包括两种情况:第一种是边界(开头)的单词字符,一种是空格之后的新单词的第一个字母。测试代码如下:

<script type="text/javascript">  function replaceReg(reg,str){   str = str.toLowerCase();   return str.replace(reg,function(m){return m.toUpperCase()})  }  var reg = //b(/w)|/s(/w)/g;  var str = 'bl idea';  var str2 = 'BL IDEA';  var str3 = 'Test /n str is no good!';  var str4 = 'final test';  document.write(replaceReg(reg,str)+'<br />');  document.write(replaceReg(reg,str2)+'<br />');  document.write(replaceReg(reg,str3)+'<br />');  document.write(replaceReg(reg,str4)+'<br />');  </script>

正则验证日期格式

来源:yyyy-mm-dd的正则怎样写啊?

yyyy-mm-dd格式

正则如下:

/^/d{4}-/d{1,2}-/d{1,2}$/

4位数字,横线,1或者2位数字,再横线,最后又是1或者2位数字。

测试代码如下:

<script type="text/javascript">  function testReg(reg,str){   return reg.test(str);  }  var reg = /^/d{4}-/d{1,2}-/d{1,2}$/;  var str = '2008-8-8';  var str2 = '2008-08-08';  var str3 = '08-08-2008';  var str4 = '2008 08 08';  document.write(testReg(reg,str)+'<br />');  document.write(testReg(reg,str2)+'<br />');  document.write(testReg(reg,str3)+'<br />');  document.write(testReg(reg,str4)+'<br />');  </script>

第二种格式:来源:求一正则表达式
yyyy-mm-dd

yyyy/mm/dd

用“或”简单地修改一下就行了。

/^/d{4}(-|//)/d{1,2}(-|//)/d{1,2}$/

去掉文件的后缀名

来源:求一个正则

www.abc.com/dc/fda.asp变为www.abc.com/dc/fda

如果文件后缀已知的话这个问题就非常简单了,正则如下:

//.asp$/

匹配最后的.asp而已,测试代码如下:

<script type="text/javascript">  function delAspExtension(str){   var reg = //.asp$/;   return str.replace(reg,'');  }  var str = 'www.abc.com/dc/fda.asp';  document.write(delAspExtension(str)+'<br />');  </script>

如果文件名未知的话就用这个正则://./w+$/,测试代码如下:

<script type="text/javascript">  function delExtension(str){   var reg = //./w+$/;   return str.replace(reg,'');  }  var str = 'example.com/dc/fda.asp';  document.write(delExtension(str)+'<br />');  var str2 = 'test/regular/fda.do';  document.write(delExtension(str2)+'<br />');  var str3 = 'example.com/dc/fda.strange_extension';  document.write(delExtension(str3)+'<br />');  </script>

验证邮箱的正则表达式

来源:找javascript写的表单检查代码!

f hangxi的正则:

/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(/.[a-zA-Z0-9_-])+/

开始必须是一个或者多个单词字符或者是-,加上@,然后又是一个或者多个单词字符或者是-。然后是点“.”和单词字符和-的组合,可以有一个或者多个组合。

<script type="text/javascript">  function isEmail(str){   var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(/.[a-zA-Z0-9_-])+/;   return reg.test(str);  }  var str = 'test@hotmail.com';  document.write(isEmail(str)+'<br />');  var str2 = 'test@sima.vip.com';  document.write(isEmail(str2)+'<br />');  var str3 = 'te-st@qq.com.cn';  document.write(isEmail(str3)+'<br />');  var str4 = 'te_st@sima.vip.com';  document.write(isEmail(str4)+'<br />');  var str5 = 'te.._st@sima.vip.com';  document.write(isEmail(str5)+'<br />');  </script>

我不太了解邮箱的具体规则。感觉这个正则比较简单,EMAIL校验 正则 讨论 求解里有比较详细的邮箱正则讨论。


匹配源代码中的链接

来源:正则

能够匹配HTML代码中链接的正则。

原帖正则:

/<a href=".+?">.+?<//a>/g

感觉有点严格,首先要<a href="".+?">有,而且href属性可以是一个或者多个除换行外任意字符(非贪婪)。后面是.+?<//a>,一个或者多个除换行外任意字符(非贪婪),再加上结束标签。

有个问题,如果a的起始标签最后有空格,或者除了href还有其它属性的话,上面的正则就不能匹配这个链接了。

例如:

<a href="asdfs" >……多了个空格。

<a id="xx" href=""asdfs">……前面有属性。

……

重写正则:

/<a/s(/s*/w*?=".+?")*(/s*href=".+?")(/s*/w*?=".+?")*/s*>[/s/S]*?<//a>/

思路如下:首先要有<a和一个空格。/<a/s/

第一个(/s*/w*?=".+?")*

可以匹配一个属性,属性前面可能有或者没有多余的空格,用/s*匹配;属性名肯定是单词字符,用/w*?匹配;=".+?"就是匹配属性值了非换行字符若干个;整个括号外面加个*表示可能有任意多个属性。

(/s*href=".+?")

匹配href,它也是一个属性,所以只要把上面子正则表达式中的/w修改为href=就行了。

(/s*/w*?=".+?")*重复第一个子正则表达式,再次接受任意个属性。

/s*>,属性最后再加上若干个空格和>。

[/s/S]*?,链接的文字,可能有任何字符组成,若干个,非贪婪。

<//a>最后是结束标签。

补充:属性名和=之间,以及=和属性值之间也可能有空格。所以要再加上几个/s*。

最后的实例代码如下:

<script type="text/javascript">  function findLinks(str){   var reg = /<a/s(/s*/w*?/s*=/s*".+?")*(/s*href/s*=/s*".+?")(/s*/w*?/s*=/s*".+?")  */s*>[/s/S]*?<//a>/g;   var arr = str.match(reg);   for(var i=0;i<arr.length;i++){   //alert(arr[i]);   document.write('link:'+arr[i]+'<br />');   }  }  var str = '<p>测试链接:<a id = "test" href="http://bbs.blidea.com" title="无敌">经典论坛  </a></p><a? href = "http://www.blidea.com/"? >蓝色理想</a>';  var arr = findLinks(str);  </script>

会把所有的链接在页面直接显示出来。注意,

本帖遗留问题:如何执行从右到左的匹配。貌似JS或者VBS没有提供这个功能2、JS或者VBS不支持 后行断言。。用什么方法实现这个功能。


匹配链接的文字

来源:求一正则?

代码:<a href="#>这里要保存</a>,只保存链接的文本内容,标签信息删掉。

前面写过一个匹配链接的正则:

/<a/s(/s*/w*?=".+?")*(/s*href=".+?")(/s*/w*?=".+?")*/s*>[/s/S]*?<//a>/

不过我们需要捕获的是文字内容,所以需要做一定的修改。第一步就是在所有的括号内都加上?:表示不捕获。第二步就是再多加一个括号放在[/s/S]*?两侧,这样就可以捕获到链接的文字内容了。最后正则如下:

/<a/s(?:/s*/w*?/s*=/s*".+?")*(?:/s*href/s*=/s*".+?")(?:/s*/w*?/s*=/s*".+?")*/s*>([/s/S]*?)<//a>/

测试代码如下:

<script type="text/javascript">  function anchorText(str){   var reg =/<a/s(?:/s*/w*?/s*=/s*".+?")*(?:/s*href/s*=/s*".+?")(?:/s*/w*?/s*=/s*".+?")*/s*>   ([/s/S]*?)<//a>/;   str = str.replace(reg,'$1');   return str;  }  var str = '<a id = "test" href="http://bbs.blidea.com" title="无敌">经典论坛</a>';  document.write(anchorText(str));  </script>

正则判断标签是否闭合

来源:求助 超难!正则表达式如何判断一个标签是否闭合

例如:<img xxx=”xxx” 就是没有闭合的标签;

<p>p的内容,同样也是没闭合的标签。

从简单的正则开始,先匹配起始标签

/<[a-z]+/i

再加上若干属性:

/<[a-z]+(/s*/w*?/s*=/s*".+?")*/i

下面就到关键点了,标签的闭合。标签可能有两种方式闭合,<img xxx=”xxx” />

或者是<p>xxx </p>。

(/s*//>)

匹配img类的结束,即/>。

(/s*?>[/s/S]*?<///1>)

匹配/p类标签的结束标签。>是其实标签末尾,之后是标签内容若干个任意字符,最后的<///1>就是结束标签了。

加上一个或就可以解决了,最后的完整正则表达式:

整个正则:

/<([a-z]+)(/s*/w*?/s*=/s*".+?")*(/s*?>[/s/S]*?<///1>|/s*//>)/i

拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如

<div>aaaaaa<div>test</div>

也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下:

/<([a-z]+)(/s*/w*?/s*=/s*".+?")*(/s*?>[/s/S]*?(<///1>)+|/s*//>)/