中括號在正則中稱為字符組(Character class),有的書翻譯為字符類,還有的翻譯成字符集。我覺得字符組更好點,畢竟class在計算機屬於中代表面向對象里的“類”。顧名思義,字符組為一組字符,它表示在一個位置里可能出現的多種字符。注意這里強調只匹配一個位置哦。
- 簡單字符組
- 范圍字符組
- 組合字符組
- 排除型字符組
- 字符組運算
- 預定義字符組
一、簡單字符組
示例1:[123] 可以分別匹配包含1-3這5個數的字符串。
var reg = /[123]/ reg.test('1') // -> true reg.test('2') // -> true reg.test('3') // -> true reg.test('4') // -> false reg.test('14') // -> true reg.test('25') // -> true reg.test('36') // -> true
示例2:匹配 bat、cat、fat。
var reg = /[bcf]at/ reg.test('bat') // -> true reg.test('cat') // -> true reg.test('fat') // -> true
二、范圍字符組(Range class,與連字符 “-” 一起使用)
上面示例1中 [123] 可以匹配字符'1', '2', '3'。如果要匹配0-9可以寫成 [0123456789],但有了范圍字符組更簡潔了,可以寫成 /[0-9]/。
示例3:匹配數字
var reg = /[0-9]/ reg.test('0') // -> true reg.test('1') // -> true reg.test('2') // -> true ...
示例4:匹配HTML的標題標簽
var reg = /<h[1-6]>/ reg.test('<h1>') // -> true reg.test('<h2>') // -> true reg.test('<h3>') // -> true reg.test('<h4>') // -> true reg.test('<h5>') // -> true reg.test('<h6>') // -> true reg.test('<h7>') // -> false reg.test('<div>') // -> false
匹配小寫英文字母可以用字符組 [a-z], 匹配大寫英文字母用 [A-Z]。這里最關鍵的是連字符 "-",不要理解為減號。 它的意義是“從什么到什么”,如[a-z]理解為從 “a” 到 “z”。
需要注意幾點
1. 連字符(-)只在字符組內(中括號)才是元字符。如
var reg = /1-5/ reg.test('1') // -> true reg.test('2') // -> false,不是連字符,不包含2,3,4 reg.test('-') // -> true, 這里 “-” 只是一個普通字符
2. 甚至在字符組內部,它也不一定是元字符。如
var reg1 = /[-123]/ var reg2 = /[123-]/ // 在字符組首部或尾部位置,僅作為一個普通字符,而不是表示范圍的連字符 reg1.test('-') // -> true reg2.test('-') // -> true
此外,很多元字符在字符組內都變成了普通字符,如(^$?)等。
3. 范圍不能亂寫,比如只能 [0-9],不能[9-0]。不然瀏覽器會報錯,如下是Firebug的報錯
范圍字符組實際是安裝字符對於的ASCII碼值來確定的,值小的在前面,值大的在后面。例如[0-9]的碼值為48~57,[a-z]的碼值為97~122,[A-Z]的碼值為65~90。
附上ASCII表
另外,可以這么寫 [0-z],即表示范圍ASCII 48~122,但不推薦這么寫,它的意義不直白。如果不查ASCII表,很難知道它表示數字[0-9],大寫字母[A-Z],小寫字母[a-z]和一些特殊字符([,\,],^,_,`)。
三、組合字符組(Combination class)
由多種字符組組合一起的字符組
示例5:匹配a~f和1-5之間的字符 [a-f1-5]
var reg = /[a-c1-3]/ reg.test('a') // -> true reg.test('b') // -> true reg.test('c') // -> true reg.test('1') // -> true reg.test('2') // -> true reg.test('3') // -> true
需要注意的是,字符組內不要有空格,有人喜歡在f和1之間加個空格,以便閱讀起來舒服一些,但這是不允許的。
四、排除型字符組(Negated character class,與脫字符 “^” 一起使用)
有時列出所有的字符幾乎不可能,那得列多少啊,這時可以使用排除型字符組。只要在左方括號后緊跟一個脫字符^即可。排除型字符組表示:匹配一個未列出的字符(match a character that's not listed),而不是不要匹配列出的字符。
示例6:匹配非數字字符
var reg = /[^0-9]/ reg.test('1') // -> false reg.test('2') // -> false reg.test('a') // -> true
五、字符組運算(方括號嵌套+運算符)
有些語言支持,比如&&+[] Java中就支持,但JavaScript不支持。
示例7:匹配英文字母中除去元音字符的字符
[[a-z]&&[^aeiou]] // a-z 且排除掉5個元音字符aeiou
六、預定義字符組(又稱字符組簡記)
比如JavaScript中提供了 \d, \w, \s 表示數字字符組(digit),單詞字符組(word),和空白符字符組(space)。另外還有對於的排除型字符組簡寫 \D,\W,\S 分別對於非數字字符組,非單詞字符組,非空白字符組。
\d == [0-9] \w == [a-zA-Z_0-9] \s == [ \t\n\x0B\f\r]