正则表达式的基本用法

1、点号(.),它用来匹配任意一个单字符(\n 排除在外)。
1
2
3
"twoon" regexp /tw.on/  为true

“twvon" regexp /tw.on/ 也为true.

点号在正则表达式中是有特殊含义的,有时我们可能也要匹配点号,这时就需要转义一下。

1
"twoo.n" regexp /twoo\.n/  为true.

正则表达中,所有其它的通配符也都可以用同样的方式进行转义,表示直接匹配通配符,去除它的特殊含义。
你可以看到\也是一个通配符,如果要匹配它也是同样的道理。

1
"two\\on" regexp /two\\on/  为true.

2、星号(*) : 星号代表匹配它前面一个字符任意遍(0或任意次),它是一数量词(quantifier),必须跟在其它字符的后面,否则这个表达式不正确。
1
2
3
4
5
”twoon" regexp /two*n/  为true

“twn" regexp /two*n/ 也为true.

"twoon" regexp /*twoon/ 表达式不正确,*必须跟在其它符号后面.

同时时星号也可以匹配点号(.),点号代表任意非回车字符,因此, (.*)就代表任意字符任意次。这是一个惯常的用法,如:/twoon.*walks/能匹配任意包含”twoon”在前,”walks“在后的字符串。所以(.*)也被称为:any old junk. 匹配任何东西。

3、加号(+): 加号是一个与星号(*)类似的通配符,它也是数量词,表示匹配前面的字符一次或多次(至少一次).

它与星号的差别就在这里,星号可以匹配0次,加号则必须一次以上。

1
2
3
"twoon" regexp /two+n/  为true

"twn" regexp /two+n/ 为false

4、问号(?): 问号也是一个数量词,它代表匹配前一个字符0或1次。
1
2
3
4
5
"twoon" regexp /twoo?n/  为true

"twoon” regexp /two?n/ 为false

"twn" regexp /two?n/ 为true.
5、括号(()): 括号用来表示一个组合,前面我说数量词作用在前一个字符上,这个说法事实上不准确,应该说是作用在一个组合上,一个字符是一个组合,但多个字符也可以成为组合。括号就是用来表示一个组合,被括号括起来的就是一个组合。
1
2
3
4
5
6
7
8
9
10
11
"twoon"  regexp /tw(o)*n/   为true.

"twoon" regexp /tw(oo)*n/ 为true

"twowon" regexp /t(wo)*n/ 为true.

"twoon" regexp /t(wv)*oon/ 为false.

“twoon" regexp /t(wo)+on/ 为true.

"twon" regexp /t(wo)+on/ 为false.

括号里可以放置任何字符,也可以放置其它通配符,如"aaabcc" regexp /(aa+b)?cc/

6、引用通配符:反斜杠加上数字是所谓引用通配符(back reference): \1 \2 \3 等,它的作用是引用前面的某个括号元组,如:
1
"twoonwo" regexp /t(wo)on\1/   为true

乍看起来,似乎作用不明显,如上例,我们完全可以不用\1,而写成这样: /t(wo)on(wo)/

在上面的例子里,这个质疑是可以理解的。但有时,我们的括号元组可能这样写的: (we…) 因为点号代表任意字符,如果我们后面要作用这个元组,不用引用通配符, 我们根本无法引用,具体看例子:

1
2
3
4
5
”weabceeweabc" regexp /(we...)ee\1/       为true。

“weabceeweabc" regexp /(we...)ee(we...)/ 为true

”weabceewecdf" regexp /(we...)ee(we...)/ 也为true.

从第2,3个例子,我们可以看区别。\1 表示的是与前一个元组完全一样的匹配。而 \1,\2,\3等,则分别表示,从左往右数第几个元组。

1
“abcdef def abc" regexp /(...)(...) \2\1/ 为 true.

7、中括号[]: 中括号用来表示一个字符集合(character set)

字符集合,顾名思义,就是字符的集合,集合的元素放在中括号里,表示每次匹配中其中的一个,如:"twoon” regexp /[tw]woo/ 为 true
有时如果这个集合有很多元素,如26个字母,数字等,一个个地写在中括号里,未免太麻烦太蠢笨,这时可以用连字符(hyphen)来表示一个范围,如:[a-z]表示小写字母的集合,[a-zA-Z]表示大小写字母的集合。
上面的用法用于提供范围来选择,但有时不匹配某个范围也是很常见的匹配需求,这时我们可以在集合的开头放一个脱字符 ^ (caret). 这种写法表示,匹配任何不在该集合中的字符,与上面的用法刚好相反。如:”twoon” regexp /[^two]woon/ 为false
“ewoon" regexp /[^two]woon/ 为true
由上面的用法,可知 ^,- 这两种符号在集合中有特殊含义,如果我们们想在集合中表示这两个字符,就也要转义一下。如:[\^ab\-]

有些字符集合是很常用的,如字母,数字等,如:\d表示一个数字,等价于[0-9],这些特殊字符包括如下 :

1
2
3
4
5
6
7
8
9
\w -- (小写w) 表示字母或数字,等价于 [a-zA-Z0-9]

\W -- (大写W)非字母且非数字,与\w相反

\s -- (小写s)匹配一个空格字符,包括:空格,换行,回车,tab,等价于[ \n\r\t\f]

\S -- (大写S)匹配非空格字符,\s的相反

\d -- 表示10进制数字,等价于 [0-9]

8、大括号:{}

大括号的作用是指定重复前面一个字符多少遍:

1
2
3
4
5
6
7
{n} 重复n遍

{n,m} 重复 n~m 遍

{n,} 至少重复n遍

{,m} 至多重复m遍

示例:

1
"twoon" regexp /two{2}n/    为true

9、^,& 这两个通配符用来表示在匹配串的头部或尾部匹配。

一般我们写这种: "twoon" regexp /oo/ 正则表达式的时候,匹配是从”twoon”的开始一路匹配下去,如tw != oo,就继续往下匹配,但有时候我们可能只想匹配一下开头或结尾,这时^,&就派上用场了。^用于匹配字符串的开关,&用于匹配字符串的结尾。
如:

1
2
3
4
5
6
7
8
9
"twoon" regexp "^tw"  为true.

“twoon” regexp “oo" 为true

"twoon" regexp "^oo" 为false.

”twoon" = "on&" 为true.

"twoon“ = ”oo&" 为false

10、“或” 通配符: 正则表达式用竖线 | 表示或, (ab | cd) 表示匹配竖线左右的字符组之一,如果左右的字符数超过一个,它必须和括号一起使用。
1
2
3
4
5
"twoon” regexp /t|ewoon/     为true

"twoon" regexp /(tw|ee)oon/ 为true

"twoon" regexp /(ee|gs)oon/ 为false