正則表達式中括號的多義性


中括號在正則中稱為字符組(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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM