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]/就相当配任意空白符或者数字。注意,这里来一个特例。下面我们拿会晤相转义符\b具有的独特意义,当用在字符类中时时,它表示的是退格符,所以如果当正则表达式中遵循直接量表示一个退格符,只待采用所有一个素的字符类/[\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?/ // 精确匹配三单单词和一个可选的数字
/\s+java\s+/ // 匹配前后带有一个要么多个空格的字符串”java”
/[^(]/ // 匹配一个要么多单不左括哀号的字符
在使用“
”和“?”时只要小心,由于这些字符或相当配0只字符,因此其允许什么都未般配。例如,正则表达式/a*/实际上与字符串“bbbb”匹配,因为此字符串含有0个a。

非贪婪的还

发明10-3着列有的匹配重复字符是竭尽多地兼容,而且允许继续的正则表达式继续配合。因此,我们称为“贪婪的”匹配。我们一样好下正则表达式进行非贪婪匹配。只须于需要匹配的字符后紧跟着一个问号即可:“??”、“+?”、“*?”或“{1,5}?”。比如,正则表达式/a+/可以匹配一个要么多单连续的字母a。当用“aaa”作为匹配字符串时,正则表达式会配合它的老三独字符。但是/a+?/也可兼容一个要多个连字母a,但她是尽可能少地配合。我们一致将“aaa”作为匹配字符串,但晚一个模式只能配合第一单a。

以非贪婪的匹配模式所抱的结果也许同梦想并无一致。考虑以下正则表达式/a+b/,它好兼容一个还是多单a,以及一个b。当使用“aaab”作为匹配字符串时,它会配合整个字符串。现在再试一下非贪婪匹配的版本/a+?b/,它相当尽可能少的a和一个b。当用她来配合“aaab”时,你希望它能够配合一个a与终极一个b。但实际,这个模式可相当了合字符串,和欠模式的唯利是图匹配同模一样。这是为正则表达式的模式匹配总是会找字符串中第一个或相当的位置。由于该匹配是从字符串的首先单字符开始之,因此在这里不考虑其的子串中重新短的相当。

1.4挑选、分组和援

正则表达式的语法还包指定选择项、子表达式分组和援前一子表达式的特殊字符。字符“|”用于分隔供选择的字符。例如,/ab|cd|ef/可以兼容配字符串“ab”,也得以兼容配字符串“cd”,还好配合配字符串“ef”。/\d{3}|[a-z]{4}/匹配的凡三各数字还是四只小写字母。

顾,选择项的品匹配次序是从漏洞百出到右手,直到发现了相当配项。如果左边的选项项匹配,就大意右边的匹配项,即使它们发更好之配合。因此,当正则表达式/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修饰符

正则表达式中的语法还有最后一个知识点,即正则表达式的修饰符,用以证明高级匹配模式的平整。和前面讨论的正则表达式语法不同,修饰符是在“/”符号之外的,也就是说,它们不是出现于片长条斜线之间,而是第二漫长斜线后。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对象。第一独参数包含正则表达式的重头戏部分,也就是是正则表达式直接量中简单久斜线之间的文书。需要小心的是,不论是字符串直接量还是正则表达式,都用“”字符作为转义字符的前缀,因此当为RegExp()传入一个字符串表述的正则表达式时,必须以“”替换成“\”。RegExp()的亚独参数是可选的,如果提供次独参数,它便指定正则表达式的修饰符。不过只能传入修饰符g、i、m或者它们的做。比如:

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

3.1 RegExp的属性

每个RegExp对象还包含5只属性。属性source是一个不过读的字符串,包含正则表达式的文本。属性global是一个单纯念之布尔值,用以证明这个正则表达式是否带有修饰符g。属性ignore-Case也是一个就念的布尔值,用以证明刚刚则表达式是否含有修饰符i。属性multiline是一个不过读之布尔值,用以证明刚刚则表达式是否含有修饰符m。最后一个性质lastIndex,它是一个可读/写的整数。如果配合模式涵盖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()更简短有。它的参数是一个字符串,用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-20单英文或中文字符

/^([\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/