正则表达式是一个用来匹配字符串中字符组合的模式。
在JavaScript中,正则表达式是一个对象。
RegExp的exec和test方法以及String的 match
, replace
, search
, 和 split
方法使用到正则表达式。
创建正则表达式:
你可以用下面两种方式创建正则表达式:
1.使用正则表达式字面量创建,在斜括号中包含了正则表达式,如下
var re = /ab+c/;
正则表达式字面量在script下载的时候提供编译正则表达式。
当正则表达式一直保持不变的时候,使用上面的方法是最佳选择。
2.调用RegExp的构造函数,如下
var re = new RegExp("ab+c");
使用构造函数则在正则表达式运行的时候进行编译。
当正则表达式会改变或者正则表达式是用户输入时,采用如上构造函数方法创建。
书写正则表达式模式
一个正则表达式模式包含了简单的字符,例如/abc/
, 或者是简单字符和特殊字符的组合,例如/ab*c/
和 /Chapter (d+).d*/
.
使用简单模式
简单模式是由一些你想直接匹配的字符构成。
例如: /abc/
只是匹配了字符‘abc’,字符连接在一起且必须按照这样的顺序。这样的匹配将会在字符串"Hi, do you know your abc's?" 和"The latest airplane designs evolved from slabcraft." 中成功,但是在'Grab crab' 字符串中失败,因为它包含了字串'ab c',而不是字串'abc'。
使用特殊字符
当搜索模式不仅仅是简单的直接字符的时候,比如寻找一个或者更多的b字符,亦或寻找空格匹配等等,这些匹配模式将包含特殊字符。
例如,匹配模式/ab*c/
匹配了在一个简单的a字符后包含了一个亦或多个b字符(*意味着前一个字符出现0以上次数)后马上跟随c字符的任何的字符串。在字符串"cbbabbbbcdebc," 中匹配的字串是'abbbbc'。
下表展示了完整的特殊字符列表。
特殊字符 | 意义 |
1.作为转义字符,例如 2.后面的字符作为普通字符,例如*只匹配符号* |
|
^ | 匹配字符串的开始
例如 /^A/不匹配字符串”an A”中的A,匹配字符串”An E”中的A |
$ |
匹配字符串的结束 |
* | 匹配前面的表达式0或多次,等价于{0,} |
+ | 匹配前面的表达式1或者多次,等价{1,} |
? | 匹配前面的表达式0或者1次,等价{0,1}
注意:在任何特殊字符*, +, ?, or {}之后马上使用?是不贪婪匹配(匹配最少的可能字符)。和默认相反的是贪婪匹配(匹配尽可能多的字符)。 比如:在字符串”123abc”中使用正则/d+/匹配的是“123”,但是应用正则/d+?/只匹配”1” |
. | 点号匹配任何一个简单的字符,除了换行符(newline character)
例如:/.n/匹配字符串"nay, an apple is on the tree", but not 'nay' 的结果是 'an' 和 'on',而不是’nay’ |
(x) | 匹配了x并且记住匹配内容,如下例:圆括号亦被叫做捕获型括号(capturing parenthese)
在字符串"foo bar foo bar"中应用 /(foo) (bar) 1 2/,' |
(?:x) | 匹配x但是不记住陪陪的字符项。这里的圆括号叫做不捕获型括号(non-capturing parenthese),可以让你的定义正则表达式运算符的子表达式。
例如,如果表达式是/foo{1,2}/,字符{1,2}将匹配foo的最后一个单词o,但是使用non-capturing parenthese,使用/(?:foo){1,2}/时,字符{1,2}将匹配整个单词’foo’ |
x(?=y) | 匹配后面紧跟着y的x。
例如/Jack(?=Sprat)/匹配后面紧跟着’Sparat’的’Jack’ /Jack(?=Sprat|Frost)/匹配后面紧跟着'Sprat' 或 'Frost'的'Jack'
|
x(?!y) | 匹配后面不紧跟y的x
/d+(?!.)/匹配后面不紧跟着小数点的数字。
|
x|y | 匹配x或者y'
/green|red/匹配字符串"green apple"中的'green' 和字符串"red apple."中的'red' |
{n} | 匹配前面发生n次的字符表达式。注意N一定要是正整数
例如: /a{2}/ 不匹配"candy,"中的”a”但是它匹配"caandy,"中的所有a和"caaandy."中的前两个a
|
{n,m} | n和m都是正整数,并且n<=m匹配前面的表达式至少n次最多m次。当m省略时,默认为正无穷(∞)。
例如, /a{1,3}/ 不匹配"cndy"中的任何字符, 匹配"candy,"中的’a’, 匹配"caandy," 中的前面两个’a’,匹配 "caaaaaaandy"中的前面三个’a’。注意当匹配 "caaaaaaandy"时, 匹配的结果是"aaa", 虽然原始字符包含更多的a。
|
[xyz] | 匹配括号中个任意字符,包括转义序列。特殊字符比如*和点号.在此方括号中不再特殊,所以它们无需在方括号中转义。你可以使用连接符指定一个字符范围,如下:
[a-d]和[abcd]等价,匹配"brisket"中的”b”和“city”中个“c”。模式/[a-z.]+/和 /[w.]+/匹配"test.i.ng"整个字符。
|
[^xyz] | 不匹配方括号中的任何字符串。例如:
[^abc]和[^a-c]等价。匹配"brisket"中的'r'。 |
[] | 匹配退格(backspace (U+0008)) |
匹配一个单词边界,也就是前面或者后面不包含任何的字符。
/m/ matches the 'm' in "moon" ;
|
|
B | 匹配一个非单词边界(a non-word boundary)。它匹配了前面和后面的字符都是统一模式:要么都是包含字符,要么都是不包含字符。字符串的开始和结束被视为non-words.
例如:For example, /B../ matches 'oo' in "noonday", and /yB./ matches 'ye' in "possibly yesterday."
|
cX | X是a到z之间的字母。匹配了字符串中的控制符(a control character)
For example, /cM/ matches control-M (U+000D) in a string.
|
d | 匹配了一个数字,等价于[0-9]
For example, /d/ or /[0-9]/ matches '2' in "B2 is the suite number."
|
D | 匹配了一个非数字。等价于[^0-9] .
|
f | 匹配一个换页符(a form feed)(U+000C). |
匹配了一个换行符(a line feed (U+000A).) | |
匹配了一个回车符(a carriage return (U+000D)) | |
s | 匹配了一个空格符号,包括空格键,tab键,换行符和换页符。等价于[ f
vu00a0u1680u180eu2000-u200au2028u2029u202fu205fu3000ufeff] .
|
S | 匹配了除了空格符号的character。
等价于 [^ f
vu00a0u1680u180eu2000-u200au2028u2029u202fu205fu3000ufeff] .
|
|
Matches a tab (U+0009). |
v |
Matches a vertical tab (U+000B). |
w |
Matches any alphanumeric character including the underscore. Equivalent to For example, |
W |
Matches any non-word character. Equivalent to For example, |
n |
Where n is a positive integer, a back reference to the last substring matching the n parenthetical in the regular expression (counting left parentheses). For example, |
|