JS正则表明式(JavaScript regular expression)

RegExp直接量和目的的始建

就如字符串和数字同样,程序中每一个取值相同的原始类型直接量均表示同样的值,那是肯定的。程序运行时老是碰到对象直接量(开首化表明式)诸如{}和[]的时候都会制造新目的。比如,假若在循环体中写var
a =
[],则每回遍历都会创制三个新的空数组。正则表明式直接量则与此不相同,ECMAScript
3规范规定,三个正则表明式直接量会在实施到它时转换为三个RegExp对象,同一段代码所代表正则表明式直接量的历次运算都回来同一个对象。ECMAScript
5正规则做了相反的鲜明,同一段代码所表示的正则表明式直接量的历次运算都回来新目的。I
E一向都以服从EC-MAScript
5规范落实的,多数最新版本的浏览器也发轫遵循EC-MAScript
5,尽管近日该标准尚未周全广泛推行。

1.1直接量字符

正则表明式中的全数字母和数字都以根据字面意思举行匹配的。JavaScript正则表明式语法也支撑非字母的字符匹配,那些字符必要经过反斜线()作为前缀举办转义。比如,转义字符\n用以匹配换行符。表10-1中列出了这几个转义字符。

表10-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

在正则表明式中,许多标点符号具有尤其含义,它们是:^ $ . * + ? = ! : |
\ / ( ) [ ] { }

正则表达式“/\/”用以匹配任何带有反斜线的字符串。

1.2字符类

例如,/[\u0400-\u04FF]/用以匹配全数的Cyrillic字符)。

表10-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 退格直接量(特例)

在意,在方括号之内也得以写那几个独特转义字符。比如,由于\s匹配全数的空白字符,\d匹配的是持有数字,因而/[\s\d]/就匹配任意空白符或许数字。注意,那里有3个特例。上面我们将会看出转义符\b具有的新鲜意义,当用在字符类中时,它象征的是退格符,所以要在正则表明式中依据直接量表示1个退格符,只须求选取具有一个成分的字符类/[\b]/。

1.3重复

大家在正则格局之后紧跟着用以钦定字符重复的标志。由于某些重复体系非日常用,由此就有部分特意用来表示那种场馆的特殊字符。例如,“+”用以匹配前七个方式的多少个或多个副本。表10-3计算了这么些代表重复的正则语法。

表10-3:正则表达式的重复字符语法
字符 含义
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项至少n次
{n} 匹配前一顶n次
? 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次,等价于{0,}

此地有一对例子:
/\d{2,4}/ // 匹配2~4个数字
/\w{3}\d?/ // 精确匹配多个单词和1个可选的数字
/\s+java\s+/ // 匹配前后带有八个或五个空格的字符串”java”
/[^(]/ // 匹配一个或多个非左括号的字符
在使用“
”和“?”时要注意,由于那个字符大概匹配0个字符,因而它们允许什么都不同盟。例如,正则表达式/a*/实际上与字符串“bbbb”匹配,因为这么些字符串含有0个a。

非贪婪的重复

表10-3中列出的合作重复字符是硬着头皮多地包容,而且允许继续的正则表明式继续合营。因而,大家誉为“贪婪的”匹配。大家一致可以使用正则表明式进行非贪婪匹配。只须在待匹配的字符后跟随三个问号即可:“??”、“+?”、“*?”或“{1,5}?”。比如,正则表明式/a+/可以匹配2个或多少个一而再的字母a。当使用“aaa”作为匹配字符串时,正则表达式会同盟它的多个字符。可是/a+?/也得以协作三个或五个一而再字母a,但它是尽大概少地包容。大家同样将“aaa”作为匹配字符串,但后贰个情势只好合营第①个a。

利用非贪婪的相当方式所获取的结果或许和愿意并不等同。考虑以下正则表明式/a+b/,它可以协作一个或七个a,以及1个b。当使用“aaab”作为匹配字符串时,它会合作整个字符串。将来再试一下非贪婪匹配的版本/a+?b/,它十分尽或者少的a和一个b。当用它来同盟“aaab”时,你愿意它能匹配七个a和尾数b。但实质上,这么些形式却相当了全数字符串,和该格局的物欲横流匹配一模一样。那是因为正则表明式的方式匹配总是会招来字符串中首先个恐怕拾分的地点。由于该匹配是从字符串的率先个字符先河的,因而在此间不考虑它的子串中更短的匹配。

1.4挑选、分组和引用

正则表达式的语法还包罗指定选取项、子表明式分组和引用前一子表达式的特殊字符。字符“|”用于分隔供选拔的字符。例如,/ab|cd|ef/可以匹配字符串“ab”,也得以匹配字符串“cd”,还是可以匹配字符串“ef”。/\d{3}|[a-z]{4}/匹配的是3个人数字如故三个小写字母。

在意,采取项的尝试匹配次序是从左到右,直到发现了匹配项。假如右侧的选用项匹配,就忽略左侧的匹配项,即便它发出更好的匹配。因而,当正则表明式/a|ab/匹配字符串“ab”时,它不得不合营第陆个字符。

表10-4:正则表达式的选择、分组和引用字符
字符 含义
| 选择,匹配的是该符号左边的子表达式或右边的子表达式
(…) 组合,将几个项组合为一个单元,这个单元可通过“*”、“+”、“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:…) 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码

1.5点名匹配岗位

正如前方所介绍的,正则表达式中的多个成分才可以匹配字符串的三个字符。例如,\s匹配的只是二个空白符。还有部分正则表达式的成分匹配的是字符之间的地点,而不是实际的字符。
最常用的锚成分是^,它用来匹配字符串的上马,锚成分$用于匹配字符串的截至。

表10-5:正则表达式中的锚字符
字符 含义
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置(但需要注意,[\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

1.6修饰符

正则表明式中的语法还有最终三个知识点,即正则表明式的修饰符,用以阐明高级匹配情势的平整。和事先商讨的正则表明式语法差距,修饰符是身处“/”符号之外的,约等于说,它们不是出现在两条斜线之间,而是第2条斜线之后。JavaScript帮助两个修饰符,修饰符“i”用以讲明格局匹配是不区分轻重缓急写的。修饰符“g”表明情势匹配应该是全局的,约等于说,应该找出被搜寻字符串中保有的合营。修饰符“m”用以在多行格局中执行匹配,在那种情势下,假如待检索的字符串包罗多行,那么^和$锚字符除了出色整个字符串的始发和最后之外,仍是可以匹配每行的起头和最后。比如正则表明式/java$/im可以匹配“java”也得以协作“Java\nis
fun”。

表10-6:正则表达式修饰符
字符 含义
i 执行不区分大小写的匹配
g 执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束

2.用以方式匹配的String方法

方法 描述 FF IE
search 检索与正则表达式相匹配的值。 1 4
match 找到一个或多个正则表达式的匹配。 1 4
replace 替换与正则表达式匹配的子串。 1 4
split 把字符串分割为字符串数组。 1 4

2.1search()

它的参数是壹个正则表达式,再次来到第三个与之匹配的子串的发端地点,如若找不到万分的子串,它将赶回-1。
只要search()的参数不是正则表明式,则率先会透过RegExp构造函数将它转换来正则表明式,search()方法不扶助全局检索,因为它忽略正则说明式参数中的修饰符g。

"JavaScript".search(/script/i);  //4

2.2replace()

replace()方法用以实施检索与替换操作。其中第四个参数是一个正则表明式,第二个参数是要举行轮换的字符串。

"JavaScript".replace(/javascript/gi, "a")   //"a"
// 一段引用文本起始于引号,结束于引号
// 中间的内容区域不能包含引号
var quote = /"([^"]*)"/g;
// 用中文半角引号替换英文引号,同时要保持引号之间的内容(存储在$1中)没有被修改
text.replace(quote, '“$1”');

2.3match()

match()方法是最常用的String正则表明式方法。它的唯一参数就是三个正则表明式(或透过RegExp()构造函数将其更换为正则表明式),再次回到的是壹个由卓越结果组成的数组。

"1 plus 2 equals 3".match(/\d+/g) // 返回 ["1", "2", "3"]
例如,使用如下的代码来解析一个URL:
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at http://www.example.com/~david";
var result = text.match(url);
if (result != null) {    
    var fullurl = result[0]; 
    // 包含 "http://www.example.com/~david"    
    var protocol = result[1]; 
    // 包含 "http"
    var host = result[2]; 
    // 包含 "www.example.com"    
    var path = result[3]; 
    // 包含 "~david"
}

2.4split()

以此方式用以将调用它的字符串拆分为二个子串组成的数组,使用的相间符是split()的参数

"123,456,789".split(","); // 返回 ["123","456","789"]

split()方法的参数也可以是二个正则表达式,那使得split()方法丰富强硬。例如,能够钦赐分隔符,允许两边可以留有任意多的空白符:

"1, 2, 3, 4, 5".split(/\s*,\s*/); // 返回 ["1","2","3","4","5"]

3.RegExp对象

正则表明式是通过RegExp对象来代表的。除了RegExp()构造函数之外,RegExp对象还帮助四个法子和一部分品质。
RegExp()构造函数带有五个字符串参数,其中第四个参数是可选的,RegExp()用以创制新的RegExp对象。第3个参数包含正则表明式的关键性部分,也就是正则表达式间接量中两条斜线之间的文书。须要小心的是,不论是字符串直接量依然正则表明式,都使用“”字符作为转义字符的前缀,由此当给RegExp()传入一个字符串表述的正则表达式时,必须将“”替换来“\”。RegExp()的第2个参数是可选的,若是提供首个参数,它就指定正则表明式的修饰符。不过只可以传入修饰符g、i、m或然它们的结缘。比如:

// 全局匹配字符串中的5个数字,注意这里使用了"\\",而不是"\"var zipcode = new RegExp("\\d{5}", "g");

3.1 RegExp的属性

各样RegExp对象都富含三个属性。属性source是3个只读的字符串,包含正则表明式的文本。属性global是二个只读的布尔值,用以评释这些正则表明式是不是包括修饰符g。属性ignore-Case也是1个只读的布尔值,用以注明正则表明式是不是含有修饰符i。属性multiline是1个只读的布尔值,用以注脚正则表明式是或不是包罗修饰符m。最后贰特性质lastIndex,它是1个可读/写的平头。若是合作格局涵盖g修饰符,那些天性存储在任何字符串中下一遍搜索的初始地方,那性子情会被exec()和test()方法用到,下边会讲到。

属性 描述 FF IE
global RegExp 对象是否具有标志 g。 1 4
ignoreCase RegExp 对象是否具有标志 i。 1 4
lastIndex 一个整数,标示开始下一次匹配的字符位置。 1 4
multiline RegExp 对象是否具有标志 m。 1 4
source 正则表达式的源文本。 1 4

3.2 RegExp的方法

RegExp对象定义了七个用于实施方式匹配操作的格局。它们的一言一动和上文介绍过的String方法很相近。RegExp最要害的举办形式匹配的法子是exec(),它与10.2节介绍过的String方法match()相似,只是RegExp方法的参数是一个字符串,而String方法的参数是一个RegExp对象。

方法 描述 FF IE
compile 编译正则表达式。 1 4
exec 检索字符串中指定的值。返回找到的值,并确定其位置。 1 4
test 检索字符串中指定的值。返回 true 或 false。 1 4

3.2.1exec()

var pattern = /Java/g;
var text = "JavaScript is more fun than Java!";
var result;
while ((result = pattern.exec(text)) != null) {    
    alert("Matched '" + 
    result[0] + "'" +        
    " at position " + result.index +        "; 
    next search begins at " + pattern.lastIndex);
}

3.2.2test()

除此以外一个RegExp方法是test(),它比exec()更简明一(Wissu)(Karicare)些。它的参数是3个字符串,用test()对有些字符串进行检测,要是带有正则表明式的二个非常结果,则赶回true:

var pattern = /java/i;pattern.test("JavaScript"); // 返回 true

4.常用正则表明式

电话号码

/^([\+][0-9]{1,3}([ \.\-])?)?([\(][0-9]{1,6}[\)])?([0-9 \.\-]{1,32})(([A-Za-z \:]{1,11})?[0-9]{1,4}?)$/

邮箱

/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i

日期(YYYY-MM-DD)

/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/

IPV4

/^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/

URL

/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i

数字(允许 +-123,123.123)

/^[\-\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\.]([0-9]+))?$/

2-1柒个英文或中文字符

/^([\u4e00-\u9fa5]{2,20})$|^([a-zA-Z]{2,20})$

愈多常用可访问:https://github.com/posabsolute/jQuery-Validation-Engine/blob/master/js/languages/jquery.validationEngine-zh_CN.js

来源&参考

《JavaScript权威指南》
http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
https://github.com/posabsolute/jQuery-Validation-Engine/