- 方括號
[ ]
只能匹配一個字符,稱為:字符類 或 字符簇。
其中連字號-
在[ ]
中使用時表示一個字符的范圍。
Example:
[a-z] // 匹配所有的小寫字母
[A-Z] // 匹配所有的大寫字母
[a-zA-Z] // 匹配所有的字母
[A-z] // 匹配所有的字母,同[a-zA-Z]
[0-9] // 匹配所有的數字
[0-9\.\-] // 匹配所有的數字、句號、減號
[ \n\f\r\t\v] // 匹配所有的空白字符(空格、換行符、換頁符、回車符、水平制表符、垂直制表符)
-
^
除了表示字符串的開頭,還有另外一個含義,即當在一組方括號里使用^
時,它表示”非”或”排除”的意思,常常用來剔除某個字符。
Example:
[^a-z] // 匹配除了小寫字母以外的所有字符
[^\\\/\^] // 匹配除了\ / ^之外的所有字符
[^\”\’] // 匹配除了雙引號和單引號之外的所有字符
- 限定符
花括號{}
跟在字符或字符簇后面,用來確定前面的內容重復出現的次數,稱為限定符。
????????{3}
???表示:前面的字符或字符簇只出現3次;
????????{3,}
?表示:前面的字符或字符簇出現3次或更多次;
????????{3,5}
表示:前面的字符或字符簇出現至少3次,至多5次;
除了{}
,還有其他的限定符,如:
*
:重復0次或多次,等價于:{0,}
+
:重復1次或多次,等價于:{1,}
?
:重復0次或1次,等價于:{0,1}
|
:指明兩項之間的一個選擇,要匹配|
,請使用\|
Example:
^[0-9]{1,}$ // 匹配所有的正數
^[0-9]+$ // +與{1,}相等,表示前面的內容可以是1個或多個
^\-{0,1}[0-9]{1,}$ // 匹配所有的整數
^\-?[0-9]+$
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ // 匹配所有小數的正則
^\-?[0-9]{0,}\.?[0-9]{0,}$ // ?與{0,1}相等,表示前面的內容是可選的
^\-?[0-9]*\.?[0-9]*$ // *與{0,}相等,表示前面的內容可以是0個或多個
如果在限定符
*、+、?、{n}、{n,}、{n,m}
之后再添加一個字符?
,則表示盡可能少地重復字符?
之前的限定符的重復次數,這種匹配方式稱為懶惰匹配。與之相對應的是貪婪匹配,即僅僅使用單個限定符*、+、?、{n}、{n,}、{n,m}
的匹配。
.*?
?表示 盡可能少的 去匹配除換行符之外任意字符
.*
???表示 盡可能多的 去匹配除換行符之外任意字符
示例字符串:I love you so much! Do you know?
.*?you
會有2次匹配:I love you
和so much! Do you
.*you
??只會有1次匹配:I love you so much! Do you
- 元字符
4.1 匹配位置的元字符
??????^
?? 匹配行的開始位置
??????$
? 匹配行的結束位置
??????\b
匹配單詞的開始或結束位置
4.2 匹配字符的元字符
??????.
??匹配除換行符之外的任意字符
??????\d
匹配一個數字字符,等價于[0-9]
??????\D
匹配一個非數字字符,等價于[^0-9]
??????\w
匹配任何單詞字符(包括字母、數字、下劃線),等價于[a-zA-Z0-9_]
??????\W
匹配任何非單詞字符,等價于[^a-zA-Z0-9_]
??????\s
匹配任何空白字符,包括空格、換行符、換頁符、回車符、水平制表符、垂直制表符,等價于[ \n\f\r\t\v]
??????\S
匹配任何非空白字符,即不包含空格、換行符、換頁符、回車符、水平制表符、垂直制表符,等價于[^ \n\f\r\t\v]
??????\b
匹配一個單詞邊界,也就是指單詞和空格間的位置。 例如:er\b可以匹配”never”中的”er”,但不能匹配”verb”中的”er"
??????\B
匹配非單詞邊界。 例如:er\B
可以匹配”verb”中的”er”,但不能匹配”never”中的”er”
Example:
^.{3}$ 只能輸入長度為3的字符
^[a-zA-Z0-9]+$ 只能輸入由數字、字母組成的字符串
^\w+$ 只能輸入由數字、字母、下劃線三種單詞字符組成的字符串
(\w)\1 匹配兩個重疊出現的字符,其中\1表示對所獲取匹配的引用。例如: “aabbc11ads”,匹配結果為三組”aa”、“bb”、“11”的match。在第一次匹配過程中,\1就表示了對匹配字符a的引用,因此對連續出現的a匹配成功;若改為(\w)\1\1時,則可匹配連續出現三次的字符,如”aaabccc2sa”中的”aaa”和“ccc”。
- 正向與反向預查
"Swift1 Swift2 Swift3Swift4Swift4Swift4"
(Swift4)
匹配Swift4并獲取這一匹配,然后存儲供以后使用;
(Swift4)\1
匹配Swift4Swift4,其中\1
即表示使用了存儲的匹配(存儲的第一個匹配),相當于匹配兩次Swift4;
(Swift3)(Swift4)\2
匹配Swift3Swift4Swift4,其中\2
即表示使用了存儲的第二個匹配,即Swift4(當然第一個匹配為:Swift3);
(?:Swift3)(Swift4)\1
匹配Swift3Swift4Swift4,與(Swift3)(Swift4)\2
相同;
由于在小括號中使用了?:
,所以第一個匹配(Swift3)沒有被存儲,只存儲了后面的第二個匹配(Swift4);
若寫成(?:Swift3)(Swift4)\2
,則正則表達式錯誤,因為沒有存儲第二個匹配;
其中?:
的作用是匹配Swift3模式字符串,但不會存儲該匹配。
Swift(?=4)
匹配右邊緊跟著4的Swift;
其中(?=)
稱為:正向預查匹配,(?=4)
表示先看看有沒有4,如果有,則把4左邊的Swift匹配出來;如果沒有,則繼續向右查看,這個過程就是正向預查匹配。
(?=expression)
可理解為:匹配字符串expression前面的位置。示例:
(?=.*[0-9])
整體的含義:后面必須要帶任意長度任意字符并有一位數字。
Swift(?!4)
匹配右邊不跟著4的Swift;
其中(?!)
稱為:正向預查不匹配,(?!4)
表示先看看有沒有4,如果沒有,也即不等于4的情況,則把左邊的Swift匹配出來;如果有,則繼續向右查看,這個過程就是正向預查不匹配。
(?!expression)
可理解為:匹配后面不是字符串expression的位置。
(?<=4)Swift
匹配左邊緊跟著4的Swift,即第五個Swift單詞,索引為26到30的字符;
其中(?<=)
稱為:反向預查匹配,(?<=4)
表示先看看有沒有4,如果有,則把4右邊的Swift匹配出來;如果沒有,則繼續向右查看,這個過程就是反向預查匹配。
(?<=expression)
可理解為:匹配字符串expression后面的位置。
(?<!4)Swift
匹配左邊不跟著4的Swift,即第1、2、3、4個Swift單詞;
其中(?<!)
稱為:反向預查不匹配,(?<!4)
表示先看看有沒有4,如果沒有,也即不等于4的情況,則把右邊的Swift匹配出來;如果有,則繼續向右查看,這個過程就是反向預查不匹配。
(?<!expression)
可理解為:匹配前面不是字符串expression的位置。
- 其他例子
例子1:強密碼 (必須包含數字、小寫字母和大寫字母三種字符,即這三種字符的組合,且不能使用特殊字符,長度在8-16之間)。
^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$
例子2:強密碼 (必須包含數字和字母兩種字符,即數字和字母的組合,且不能使用特殊字符,長度在8-16之間)。
^(?=.*[0-9])(?=.*[A-z])[0-9a-zA-Z]{8,16}$
強密碼 (必須包含數字和字母兩種字符,即數字和字母的組合,且不限制是否使用特殊字符,長度在8-16之間)。
^(?=.*[0-9])(?=.*[A-z]).{8,16}$
例子3:強密碼 (必須包含數字、小寫字母、大寫字母和特殊字符四種字符,即這四種字符的組合,其中特殊字符為除數字、小寫字母、大寫字母以外的其他字符,長度在8-16之間)。
^(?:(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^0-9a-zA-Z])).{8,16}$
例子4:匹配以兩個相同字母結尾的單詞,如:zoo、success、all等。
\b[a-zA-Z]*([a-zA-Z])\1\b
例子5:金額校驗,精確到2位小數。
^[0-9]+(.[0-9]{2})?$
例子6:金額校驗,最多保留2位小數,金額范圍:0.01-10000.00。
^((0\.\d?[1-9])|(0\.[1-9]0)|([1-9]\d{0,3}(\.\d{1,2})?)|(10000(\.0{1,2})?))$
正則表達式解釋:
(0\.\d?[1-9])
???????????????????????匹配:0.01~0.09 / 0.1~0.9 / 0.11~0.99
(0\.[1-9]0)
??????????????????????????匹配:0.10 / 0.20 / 0.30 / 0.40 / 0.50 / 0.60 / 0.70 / 0.80 / 0.90
([1-9]\d{0,3}(\.\d{1,2})?)
匹配:1.00~9999.99
(10000(\.0{1,2})?)
???????????????匹配:10000 或 10000.0 或 10000.00
例子7:正整數中剔除0、1、2、8、9、10
。
^(\d{3,})|(1[1-9])|([2-9]\d)|([34567]{1})$
正則表達式解釋:
(\d{3,})
????????匹配:3位及以上數字
(1[1-9])
????????匹配:以1開頭的2位數
([2-9]\d)
??????匹配:非1開頭的2位數
([34567]{1})
?匹配:除0、1、2、8、9之外的1位數