正则表达式.docx

上传人:b****6 文档编号:5749640 上传时间:2022-12-31 格式:DOCX 页数:15 大小:108.79KB
下载 相关 举报
正则表达式.docx_第1页
第1页 / 共15页
正则表达式.docx_第2页
第2页 / 共15页
正则表达式.docx_第3页
第3页 / 共15页
正则表达式.docx_第4页
第4页 / 共15页
正则表达式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

正则表达式.docx

《正则表达式.docx》由会员分享,可在线阅读,更多相关《正则表达式.docx(15页珍藏版)》请在冰豆网上搜索。

正则表达式.docx

正则表达式

正则表达式

正则表达式是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”)。

模式描述在搜索文本时要匹配的一个或多个字符串。

一、正则表达式基础知识

我们先从简单的开始。

假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。

如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。

也就是说:

1.1句点符号

假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。

另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。

要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。

这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“tn”,还有其他许多无意义的组合。

这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:

1.2方括号符号

为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。

此时,只有方括号里面指定的字符才参与匹配。

也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。

但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:

1.3“或”符号

如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。

“|”操作符的基本意义就是“或”运算。

要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。

这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。

圆括号还可以用来分组,具体请参见后面介绍。

1.4表示匹配次数的符号

表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

假设我们要在文本文件中搜索美国的社会安全号码。

这个号码的格式是999-99-9999。

用来匹配它的正则表达式如图一所示。

在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。

因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。

图一:

匹配所有123-12-1234形式的社会安全号码

假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。

这时,你可以在连字符号后面加上“?

”数量限定符号,如图二所示:

图二:

匹配所有123-12-1234和123121234形式的社会安全号码

下面我们再来看另外一个例子。

美国汽车牌照的一种格式是四个数字加上二个字母。

它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。

图三显示了完整的正则表达式。

图三:

匹配典型的美国汽车牌照号码,如8836KV

1.5“否”符号

“^”符号称为“否”符号。

如果用在方括号内,“^”表示不想要匹配的字符。

例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。

图四:

匹配所有单词,但“X”开头的除外

1.6圆括号和空白符号

假设要从格式为“June26,1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:

图五:

匹配所有MothDD,YYYY格式的日期

新出现的“/s”符号是空白符号,匹配所有的空白字符,包括Tab字符。

如果字符串正确匹配,接下来如何提取出月份部分呢?

只需在月份周围加上一个圆括号创建一个组,然后用OROAPI(本文后面详细讨论)提取出它的值。

修改后的正则表达式如图六所示:

图六:

匹配所有MonthDD,YYYY格式的日期,定义月份值为第一个组

1.7其它符号

为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。

如表二所示:

表二:

常用符号

例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“/d”。

修改后的正则表达式如图七所示:

图七:

匹配所有123-12-1234格式的社会安全号码

 

下面是正则表达式的一些示例:

表达式匹配

/^\s*$/匹配空行。

/\d{2}-\d{5}/验证由两位数字、一个连字符再加5位数字组成的ID号。

/<\s*(\S+)(\s[^>]*)?

>[\s\S]*<\s*\/\1\s*>/匹配HTML标记。

下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:

 

字符说明

\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。

例如,“n”匹配字符“n”。

“\n”匹配换行符。

序列“\\”匹配“\”,“\(”匹配“(”。

^匹配输入字符串开始的位置。

如果设置了RegExp对象的Multiline属性,^还会与“\n”或“\r”之后的位置匹配。

$匹配输入字符串结尾的位置。

如果设置了RegExp对象的Multiline属性,$还会与“\n”或“\r”之前的位置匹配。

*零次或多次匹配前面的字符或子表达式。

例如,zo*匹配“z”和“zoo”。

*等效于{0,}。

+一次或多次匹配前面的字符或子表达式。

例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。

+等效于{1,}。

?

零次或一次匹配前面的字符或子表达式。

例如,“do(es)?

”匹配“do”或“does”中的“do”。

?

等效于{0,1}。

{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?

'。

注意:

您不能将空格插入逗号和数字之间。

?

当此字符紧随任何其他限定符(*、+、?

、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。

“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。

例如,在字符串“oooo”中,“o+?

”只匹配单个“o”,而“o+”匹配所有“o”。

.匹配除“\n”之外的任何单个字符。

若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。

(pattern)匹配pattern并捕获该匹配的子表达式。

可以使用$0...$9属性从结果“匹配”集合中检索捕获的匹配。

若要匹配括号字符(),请使用“\(”或者“\)”。

(?

:

pattern)匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。

这对于用“或”字符(|)组合模式部件的情况很有用。

例如,与“industry|industries”相比,“industr(?

:

y|ies)”是一个更加经济的表达式。

(?

=pattern)执行正向预测先行搜索的子表达式,该表达式匹配处于匹配pattern的字符串的起始点的字符串。

它是一个非捕获匹配,即不能捕获供以后使用的匹配。

例如,“Windows(?

=95|98|NT|2000)”与“Windows2000”中的“Windows”匹配,但不与“Windows3.1”中的“Windows”匹配。

预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

(?

!

pattern)执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。

它是一个非捕获匹配,即不能捕获供以后使用的匹配。

例如,“Windows(?

!

95|98|NT|2000)”与“Windows3.1”中的“Windows”匹配,但不与“Windows2000”中的“Windows”匹配。

预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。

x|y与x或y匹配。

例如,“z|food”与“z”或“food”匹配。

“(z|f)ood”与“zood”或“food”匹配。

[xyz]字符集。

匹配包含的任一字符。

例如,“[abc]”匹配“plain”中的“a”。

[^xyz]反向字符集。

匹配未包含的任何字符。

例如,“[^abc]”匹配“plain”中的“p”。

[a-z]字符范围。

匹配指定范围内的任何字符。

例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。

[^a-z]反向范围字符。

匹配不在指定的范围内的任何字符。

例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。

\b匹配一个字边界,即字与空格间的位置。

例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。

\B非字边界匹配。

“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。

\cx匹配由x指示的控制字符。

例如,\cM匹配一个Control-M或回车符。

x的值必须在A-Z或a-z之间。

如果不是这样,则假定c就是“c”字符本身。

\d数字字符匹配。

等效于[0-9]。

\D非数字字符匹配。

等效于[^0-9]。

\f换页符匹配。

等效于\x0c和\cL。

\n换行符匹配。

等效于\x0a和\cJ。

\r匹配一个回车符。

等效于\x0d和\cM。

\s匹配任何空白字符,包括空格、制表符、换页符等。

与[\f\n\r\t\v]等效。

\S匹配任何非空白字符。

等价于[^\f\n\r\t\v]。

\t制表符匹配。

与\x09和\cI等效。

\v垂直制表符匹配。

与\x0b和\cK等效。

\w匹配任何字类字符,包括下划线。

与“[A-Za-z0-9_]”等效。

\W任何非字字符匹配。

与“[^A-Za-z0-9_]”等效。

\xn匹配n,此处的n是一个十六进制转义码。

十六进制转义码必须正好是两位数长。

例如,“\x41”匹配“A”。

“\x041”与“\x04”&“1”等效。

允许在正则表达式中使用ASCII代码。

\num匹配num,此处的num是一个正整数。

到捕获匹配的反向引用。

例如,“(.)\1”匹配两个连续的相同字符。

\n标识一个八进制转义码或反向引用。

如果\n前面至少有n个捕获子表达式,那么n是反向引用。

否则,如果n是八进制数(0-7),那么n是八进制转义码。

\nm标识一个八进制转义码或反向引用。

如果\nm前面至少有nm个捕获子表达式,那么nm是反向引用。

如果\nm前面至少有n个捕获,那么n是反向引用,后面跟m。

如果前面的条件均不存在,那么当n和m是八进制数(0-7)时,\nm匹配八进制转义码nm。

\nml当n是八进制数(0-3),m和l是八进制数(0-7)时,匹配八进制转义码nml。

\un匹配n,其中n是以四位十六进制数表示的Unicode字符。

例如,\u00A9匹配版权符号(?

)。

常用表达式

1.检测时间 ([0-1]?

[0-9]|2[0-3]):

([0-5][0-9])   

2.  

3.以下是备忘:

  

4.  

5.1.检查日期:

  

6.(1[0-2]|0?

[1-9])[-./](0?

[1-9]|[12][0-9]|3[01])[-./](dddd))  

7.2.检查数字:

  

8.([-+]?

[0-9]+.?

[0-9]+)  

9.3.检查URL:

  

10.((http|ftp):

//)?

(((([d]+.)+){3}[d]+(/[w./]+)?

)|([a-z]w*((.w+)+){2,})([/][w.~]*)*)  

11.4.检查E-mail  

12.w+@((w+[.]?

)+)  

13.  

14.严格的日期验证包括格式和逻辑上的合法性!

  

15.^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$  

16.  

17.补充:

   

18.^\d+$                   //匹配非负整数(正整数 + 0)   

19.^[0-9]*[1-9][0-9]*$  //匹配正整数   

20.^((-\d+)|(0+))$       //匹配非正整数(负整数 + 0)   

21.^-[0-9]*[1-9][0-9]*$  //匹配负整数   

22.^-?

\d+$    //匹配整数   

23.^\d+(\.\d+)?

$  //匹配非负浮点数(正浮点数 + 0)   

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

25.^((-\d+(\.\d+)?

)|(0+(\.0+)?

))$  //匹配非正浮点数(负浮点数 + 0)   

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

27.^(-?

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

$  //匹配浮点数   

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

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

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

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

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

33.^[\w-]+(\.[\w?

琼?

渦獢p?

?

_?

?

_?

浜睹扥潜桴牥摜極慢?

瑨m?

_-]+)*@[\w-]+(\.[\w-]+)+$    //匹配email地址   

34.^[a-zA-z]+:

//匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?

\S*)?

$  //匹配url   

35.  

36.关键字:

正则表达式  模式匹配 Javascript  

37.  

38.摘要:

收集一些常用的正则表达式。

  

39.  

40.正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。

我将一些常用的表达式收藏在这里,作备忘之用。

本贴随时会更新。

  

41.  

42.匹配中文字符的正则表达式:

 [\u4e00-\u9fa5]  

43.  

44.匹配双字节字符(包括汉字在内):

[^\x00-\xff]  

45.  

46.应用:

计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)  

47.  

48.String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}  

49.  

50.匹配空行的正则表达式:

\n[\s| ]*\r  

51.  

52.匹配HTML标记的正则表达式:

/<(.*)>.*<\/\1>|<(.*) \/>/   

53.  

54.匹配首尾空格的正则表达式:

(^\s*)|(\s*$)  

55.  

56.应用:

javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

  

57.  

58.String.prototype.trim = function()  

59.{  

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

61.}  

62.  

63.利用正则表达式分解和转换IP地址:

  

64.  

65.下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

  

66.  

67.function IP2V(ip)  

68.{  

69. re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正则表达式  

70.if(re.test(ip))  

71.{  

72.return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1  

73.}  

74.else  

75.{  

76. throw new Error("Not a valid IP address!

")  

77.}  

78.}  

79.  

80.不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

  

81.  

82.var ip="10.100.20.168"  

83.ip=ip.split(".")  

84.alert("IP值是:

"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))  

85.  

86.匹配Email地址的正则表达式:

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

87.  

88.匹配网址URL的正则表达式:

http:

//([\w-]+\.)+[\w-]+(/[\w- ./?

%&=]*)?

  

89.  

90.利用正则表达式去除字串中重复的字符的算法程序:

[注:

此程序不正确,原因见本贴回复]  

91.  

92.var s="abacabefgeeii"  

93.var s1=s.replace(/(.).*\1/g,"$1")  

94.var re=new RegExp("["+s1+"]","g"?

琼?

渦獢p?

?

_?

?

_?

浜睹扥潜桴牥摜極慢?

瑨m?

_)  

95.var s2=s.replace(re,"")   

96.alert(s1+s2)  //结果为:

abcefgi  

97.  

98.我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。

思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。

这个方法对于字符顺序有要求的字符串可能不适用。

  

99.  

100.得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1  

101.  

102.s="  

103.s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")  

104.alert(s)  

105.  

106.利用正则表达式限制网页表单里的文本框输入内容:

  

107.  

108.用正则表达式限制只能输入中文:

onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"  

109.  

110.用正则表达式限制只能输入全角字符:

 onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"  

111.  

112.用正则表达式限制只能输入数字:

onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"  

113.  

114.用正则表达式限制只能输入数字和英文:

onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"  

115.  

116.匹配Email地址的正则表达式:

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

117.  

118.匹配网址URL的正则表达式:

http:

//([\w-]+\.)+[\w-]+(/[\w- ./?

%&=]*)?

  

119.  

120.匹配空行的正则表达式:

\n[\s| ]*\r  

121.  

122.匹配HTML标记的正则表达式:

/<(.*)>.*<\/\1>|<(.*) \/>/   

123.  

124.匹配首尾空格的正则表达式:

(^\s*)|(\s*$)  

125.  

126.匹配中文字符的正则表达式:

 [\u4e00-\u9fa5]  

127.  

128.匹配双字节字符(包括汉字在内):

[^\x00-\xff]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1