元字符
元字符 | 描述 |
---|---|
. | 匹配除換行符以外的任意字符。 |
[ ] | 字符類,匹配方括號中包含的任意字符。 |
[^ ] | 否定字符類。匹配方括號中不包含的任意字符 |
* | 匹配前面的子表達式零次或多次 |
+ | 匹配前面的子表達式一次或多次 |
? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。 |
{n,m} | 花括號,匹配前面字符至少 n 次,但是不超過 m 次。 |
(xyz) | 字符組,按照確切的順序匹配字符xyz。 |
| | 分支結構,匹配符號之前的字符或后面的字符。 |
\ | 轉義符,它可以還原元字符原來的含義,允許你匹配保留字符 [ ] ( ) { } . * + ? ^ $ | |
^ | 匹配行的開始 |
$ | 匹配行的結束 |
簡寫字符集
簡寫 | 描述 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配所有字母和數字的字符: [a-zA-Z0-9_] |
\W | 匹配非字母和數字的字符: [^\w] |
\d | 匹配數字: [0-9] |
\D | 匹配非數字: [^\d] |
\s | 匹配空格符: [\t\n\f\r\p{Z}] |
\S | 匹配非空格符: [^\s] |
斷言
后行斷言和先行斷言有時候被稱為斷言,它們是特殊類型的 非捕獲組 (用於匹配模式,但不包括在匹配列表中)。當我們在一種特定模式之前或者之后有這種模式時,會優先使用斷言。
例如我們想獲取輸入字符串 $4.44 and $10.88
中 $
字符之前的所有數字。我們可以使用這個正則表達式 (?<=\$)[0-9\.]*
,表示: 獲取 $
字符之前的所有的數字包含 .
字符。
以下是正則表達式中使用的斷言:
符號 | 描述 |
---|---|
?= | 正向先行斷言 |
?! | 負向先行斷言 |
?<= | 正向后行斷言 |
?<! | 負向后行斷言 |
正向先行斷言
正向先行斷言認為第一部分的表達式必須是先行斷言表達式。返回的匹配結果僅包含與第一部分表達式匹配的文本。
要在一個括號內定義一個正向先行斷言,在括號中問號和等號是這樣使用的 (?=...)
。先行斷言表達式寫在括號中的等號后面。
例如正則表達式 (T|t)he(?=\sfat)
,表示: 匹配大寫字母 T
或小寫字母 t
,后面跟字母 h
,后跟字母 e
。
在括號中,我們定義了正向先行斷言,它會引導正則表達式引擎匹配 The
或 the
后面跟着 fat
。
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
負向先行斷言
當我們需要從輸入字符串中獲取不匹配表達式的內容時,使用負向先行斷言。負向先行斷言的定義跟我們定義的正向先行斷言一樣,
唯一的區別是不是等號 =
,我們使用否定符號 !
,例如 (?!...)
。
我們來看看下面的正則表達式 (T|t)he(?!\sfat)
,表示: 從輸入字符串中獲取全部 The
或者 the
且不匹配 fat
前面加上一個空格字符。
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
正向后行斷言
正向后行斷言是用於獲取在特定模式之前的所有匹配內容。正向后行斷言表示為 (?<=...)
。例如正則表達式 (?<=(T|t)he\s)(fat|mat)
,表示: 從輸入字符串中獲取在單詞 The
或 the
之后的所有 fat
和 mat
單詞。
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
負向后行斷言
負向后行斷言是用於獲取不在特定模式之前的所有匹配的內容。負向后行斷言表示為 (?<!...)
。例如正則表達式 (?<!(T|t)he\s)(cat)
,表示: 在輸入字符中獲取所有不在 The
或 the
之后的所有單詞 cat
。
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
標記
標記 | 描述 |
---|---|
i | 不區分大小寫: 將匹配設置為不區分大小寫。 |
g | 全局搜索: 搜索整個輸入字符串中的所有匹配。 |
m | 多行匹配: 會匹配輸入字符串每一行。 |
常用正則表達式
- 正整數:
^\d+$
- 負整數:
^-\d+$
- 電話號碼:
^+?[\d\s]{3,}$
- 電話代碼:
^+?[\d\s]+(?[\d\s]{10,}$
- 整數:
^-?\d+$
- 用戶名:
^[\w\d_.]{4,16}$
- 字母數字字符:
^[a-zA-Z0-9]*$
- 帶空格的字母數字字符:
^[a-zA-Z0-9 ]*$
- 密碼:
^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$
- 電子郵件:
^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
- IPv4 地址:
^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
- 小寫字母:
^([a-z])*$
- 大寫字母:
^([A-Z])*$
- 網址:
^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$
- VISA 信用卡號碼:
^(4[0-9]{12}(?:[0-9]{3})?)*$
- 日期 (MM/DD/YYYY):
^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$
- 日期 (YYYY/MM/DD):
^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$
- 萬事達信用卡號碼:
^(5[1-5][0-9]{14})*$