正则表达式
正则表达式(JS版)
1.概述
正则表达式(regularexpression)是一个描述字符模式的对象。有时,正则表达式被称为“regexp”,或“RE”。
JavaScript的RegExp类表示正则表达式。
JavaScript的正则表达式完全以Perl程序设计语言的正则表达式工具为基础。
2.正则表达式的定义
在JavaScript中,正则表达式由RegExp对象表示。
(1)使用RegExp()构造函数创建RegExp对象
如:varpattern=newRegExp(“s$”);
(2)用特殊的直接量语法创建RegExp对象
像字符串直接量被定义为包含在引号内的字符一样,
正则表达式直接量也被定义为包含在一对斜杆(/)之间的字符。
如:varpattern=/s$/;
3.正则表达式的模式规范
正则表达式的模式规范是由一系列字符构成的。
大多数的字符(包括所有的字母数字字符)描述的是按照直接量进行匹配的字符。
其他的字符虽然不是按照直接量进行匹配的,但是它们具有特殊的意义。
如
(1)/java/,表示和所有包含子串“java”的字符串相匹配。
(2)/s$/,包含两个字符;
第一字符“s”按照直接量与自身相匹配,
第二个字符“$”是一个特殊元字符,它所匹配的是字符串的结尾。
所以,该正则表达式匹配的就是以字母“s”结尾的字符串。
3.1.直接量字符
在正则表达式中,所有的字母字符和数字都是按照直接量与自身相匹配的。
JavaScript的正则表达式语法还通过以反斜杆(\)开头的转义序列,支持某些非字母的字符。
表1:正则表达式的直接量字符
字符
匹配
字母数字字符
自身
\o
NUL字符(\u0000)
\t
制表符(\u0009)
\n
换行符(\u000A)
\v
垂直制表符(\u000B)
\f
换页符(\u000C)
\r
回车(\u000D)
\xnn
由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx
由十六进制xxxx指定的Unicode字符,例如,\u0009等价于\t
\cX
控制字符^X。例如,\cJ等价于换行符\n
在正则表达式中,很多标点符号具有特殊的含义。它们是:
^$.*+?=!:|\/()[]{}
在正则表达式中按照直接量使用这些标点符号,就必须用反斜杆(\)进行转义;
如:正则表达式“/\\/”与任何包含反斜杆的字符串匹配
类别:正则|浏览()网友评论:13.2.字符类
?将单独的直接量字符放进方括号内就可以组合成字符类(characterclass)。一个字符类和它所包含的任何字符都匹配。
如/[abc]/,和字母“a”,“b”,“c”中的任何一个字母都匹配。
?否定字符类,匹配的是不包含在方括号之内的所有字符。
定义否定字符类,将一个^符号作为左方括号后的第一个字符。
正则表达式/[^abc]/,匹配的是“a”,“b”,“c”之外的所有字符。
?字符类可以使用连字符来表示一个字符范围。
/[a-z]/匹配拉丁字母集中的任何小写字符,
/[a-zA-Z0-9]/匹配拉丁字母集中任何字母数字字符。
表2:正则表达式的字符类
字符匹配
[…]位于括号之内的任意字符
[^…]不在括号之中的任意字符
.除换行符和其他Unicode行终止符之外的任意字符
\w任何ASCII单字字符,等价于[a-zA-Z0-9_],包含下划线
\W任何ASCII非单字字符,等价于[^a-zA-Z0-9_]
\s任何Unicode空白符
\S任何非Unicode空白符,注意\w和\S不同
\d任何ASCII数字,等价于[0-9]
\D除了ASCII数字之外的任何字符,等价于[^0-9]
[\b]退格直接量(特例)
注意1:
在方括号之内也可以使用这些特殊的字符类转义序列。23.3.重复
(1)把两位数描述成/\d\d/,把四位数描述成/\d\d\d\d/,需要有一种方法可以用来描述具有任意多数位的数字。
(2)想描述一个字符串,这个字符串由三个字母以及跟随在字母之后的一位数字构成。
这些较复杂的模式使用的正则表达式语法都指定了该正则表达式中的一个元素重复出现的次数。
指定重复的字符总是出现在它们所作用的模式之后。
由于某种重复类型相当常用,所以就有一些特殊的字符专门用于表示这种情况。如?,+,*
表3:正则表达式的重复字符
字符含义
{n,m}匹配前一项至少n次,但是不能超过m次
{n,}匹配前一项n次,或更多次
{n}匹配前一项恰好n次
?匹配前一项0次或1次,也即前一项是可选。等价于{0,1}
+匹配前一项1次或多次,等价于{1,}
*匹配前一项0次或多次,等价于{0,}
注意:
使用重复字符?和*时,由于这些字符可能匹配前面字符的0个实例,所以它们允许什么都不匹配。
如:正则表达式/a*/实际上与字符串“bbbb”匹配,因为这个字符串含有0个a.。
3.3.1.非贪婪重复
表3中列出的重复字符可以匹配尽可能多的字符。我们说,这种重复是“贪婪的”。
可以以非贪婪的方式进行重复,只需要在重复字符后33.4.选择、分组和引用
正则表达式的语法,还包括指定选择项、对子表达式分组和引用前一子表达式的特殊字符。
3.4.1.竖线“|”作选择
字符“|”用于分隔供选择的字符。
如:
/ab|cd|ef/匹配的是字符串“ab”,或字符串“cd”,或字符串“ef”
/\d{3}|[a-z]{4}/匹配的是三位数字或四个小写字母
注意:
选择项从左到右考虑,直到发现了匹配项。
如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。
如:
/a|ab/应用到字符串“ab”上时,它只匹配第一字符。
43.4.2.括号“()”作分组
?正则表达式中,括号的作用,把单独的项目组合成子表达式,以便可以像处理一个独立的单元那样用|、*、+、?等来处理它们。
如:
/java(script)?/匹配的是字符串“java”,其后既可以有“script”,也可以没有。
/(ab|cd)+|ef/匹配的,既可以是字符串“ef”,也可以字符串“ab”或者“cd”的一次或多次重复。
?括号的另一个作用,在完整的模式中定义子模式。
当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分。
如:
/[a-z]+\d+/,一个或多个小写字母后面跟随了一位或多位数字
假定,我们真正关心的是每个匹配尾部的数字,那么将模式的数字部分放在括号中
/[a-z]+(\d+)/,这样就可以从检索到的任何匹配中抽取数字了。
3.4.3.反斜杆带数字“\n”作引用
带括号的子表达式的另一个用途是,允许我们在同一正则表达式的后面引用前面的子表达式。
通过在字符“\”后加一位或多位数字实现的。数字指定了带括号的子表达式在正则表达式中的位置。
如:
\1引用的是第一带括号的子表达式,
\3引用的是第53.4.4.“(?:)”只组合,只分组,不生成引用
在JavaScript1.5(不是JavaScript1.2)中,无须创建带编码的引用就可以将正则表达式中的项目进行组合。它不是以(和)对项目进行分组,而是以(?:和)来分组。
如:
/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
这里,子表达式(?:[Ss]cript)仅仅用于分组,并不生成引用,因此,现在,对于\2实际上引用的是与(fun\w*)匹配的文本。
表4:正则表达式的选择、分组和引用字符
字符含义
...|...选择。匹配的是该符号左边的子表达式或右边的子表达式
(...)组合。将几个项目组合为一个单元,这个单元可由*、+、?和|等符号使用,而且还可以记住和这个组合匹配的字符,以供此后的引用使用
(?:...)只组合。把项目组合到一个单元,但是不记忆与该组匹配的字符
\n和第n个分组第一次匹配的字符相匹配。
组是括号中的子表达式(可能是嵌套的)。
组号是从左到右计数的左括号数,以(?:形式分组的组不编码
63.5.指定匹配的位置
表5:正则表达式的锚字符
^匹配字符串的开头,在多行检索中,匹配一行的开头
$匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b匹配一个词语的边界。简而言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(匹配一个字边界,即字与空格间的位置)
(注意,[\b]匹配的是退格符)
\B匹配非词语边界的字符
(?=p)正前向声明,要求接下来的字符都与模式p匹配,但是,匹配结果中,不包括匹配中的那些字符
(?!p)反前向声明,要求接下来的字符不与模式p匹配
例子:
?/\bJava\b/
匹配Java、’Java’(前后带空格)不匹配:JavaScript
?/\B[Ss]cript/
匹配:JavaScript、postscript不匹配:script、Scripting
?/[Jj]ava([Ss]cript)?(?=\:)/
匹配:JavaScript:TheDefinitiveGuide
不匹配:JavainaNutshell
?/Java(?!Script)([A-Z]\w*)/
匹配:JavaBeans、Javanese不匹配:JavaScript
73.6.标志
表5:正则表达式的标志
字符
含义
i
执行大小写不敏感的匹配
g
执行一个全局匹配。简而言之,即找到所有匹配,而不是在找到第一个之后就停止
m
多行模式,
^匹配一行的开头和字符串的开头
$匹配一行的结尾或字符串的结尾
4.用于模式匹配的String方法
本节讨论String对象的部分方法,它们在正则表达式中执行模式匹配和检索与替换操作。
类String支持四种利用正则表达式的方法。
方法
用途
search(regexp)
在字符串中检索与regexp相匹配的子串,并且返回第一匹配子串的第一个字符的位置。
如果没有找到任何匹配的子串,则返回-1
replace(regexp,replacement)
查找并替换。在字符串中查找与regexp相匹配的子串,然后用replacement替换这些子串。
如果regexp具有全局性质g,那么将替换所有的匹配子串。否则,只替换第一个匹配子串。
match(regexp)
检索字符串,以找到一个或多个与regexp匹配的文本。
如果没有找到任何匹配的文本,将返回null。
否则,返回一个数组。(是否具有性质g,返回的数组大不一样,请查看帮助文档)
split(regexp,limit)
将字符85.用于模式匹配的RegExp对象
JavaScript中,正则表达式是用RegExp对象来表示的。
除了构造函数RegExp()之外,RegExp对象还支持3种方法和大量的属性。
5.1.RegExp的构造函数
newRegExp(pattern,attributes)
参数
含义
pattern
一个字符串,指定正则表达式的模式或其他正则表达式
attributes
一个可选的字符串,包含属性“g”、“i”和“m”,
如果pattern是正则表达式,而不是字符串,则必须省略该参数。
l第一个参数是包含正则表达式主体的字符串,即正则表达式直接量中出现在斜线对之间的文本。
l因此,将正则表达式作为字符串直接量传递给RegExp()时,必须用\\替换所有\字符
如:
//找到字符串中的5个数字。
varzipcode=newRegExp(“\\d{5}”,”g”);
95.2.RegExp的实例属性
属性含义返回值
globalRegExp对象是否具有性质g只读的布尔值
ignoreCaseRegExp对象是否具有性质i只读的布尔值
lastIndex上次匹配后的字符位置,用于在一个字符串中进行多次匹配
由方法exec()和test()使用可读写的整数
multilineRegExp对象是否具有m性质只读的布尔值
source正则表达式的源文本只读的字符串
5.3.用于模式匹配的RegExp方法
方法用途
exec(text)对指定的字符串,执行一个正则表达式,
也即,在一个字符串中,检索匹配。
如果没有找到任何匹配的子串,则返回null;
如果找到了一个匹配,则返回一个数组;
test(text)检测一个字符串是否匹配某个模式
如果字符串中含有匹配的文本,就返回true,否则,返回false
如:
varpattern=/java/i;
pattern.test(“JavaScript”);//返回true
varpattern=/Java/g;
vartext=“JavaScriptismorefunthanJava!”;
varresult;
while((result=pattern.exec(text))!=null)
{
alert(“Matched‘”+result[0]+“’”+“atposition“+result.index
+“;nextsearchbeginsat“+pattern.lastIndex)
}
106.常见正则表达式
^[+-]?\d+$整数
^[0-9]*[1-9][0-9]*$正整数(没有+号)
^-[0-9]*[1-9][0-9]*$负整数
^\d+$正整数+0(非负整数)
^((-\d+)|(0+))$负整数+0(非正整数)
^[a-zA-Z]+$由26个英文字母组成的字符串
^[a-zA-Z0-9]+$由数字和26个英文字母组成的字符串
^\w+$由数字、26个英文字母或者下划线组成的字符串
(^\s+)|(\s+$)首尾空格
[\u4e00-\u9fa5]匹配中文字符(Unicode编码),包括简体、繁体中文
^([0-9]){8}([a-zA-Z]){2}$前8位数字,后2位字母
^[\w.]+@[\w]+(\.[\w]{2,3}){1,2}$email地址
(\w+):\/\/([\w.]+)\/(\S*)URL
14:58|添加评论|发送消息|固定链接|引用通告(0)|写入博客|技术
Java中的17种常用正则表达式归纳
01、"^\\d+$" //非负整数(正整数+0)
02、"^[0-9]*[1-9][0-9]*$" //正整数
03、"^((-\\d+)|(0+))$" //非正整数(负整数+0)
04、"^-[0-9]*[1-9][0-9]*$" //负整数
05、"^-?\\d+$" //整数
06、"^\\d+(\\.\\d+)?$" //非负浮点数(正浮点数+0)
07、"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数
08、"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数+0)
09、"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数
10、"^(-?\\d+)(\\.\\d+)?$" //浮点数
11、"^[A-Za-z]+$" //由26个英文字母组成的字符串
12、"^[A-Z]+$" //由26个英文字母的大写组成的字符串
13、"^[a-z]+$" //由26个英文字母的小写组成的字符串
14、"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串
15、"^\\w+$" //由数字、26个英文字母或者下划线组成的字符串
16、"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$" //email地址
17、"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$" //url