正則表達(dá)式 (regex) 的快速參考,包括符號(hào)、范圍、分組、斷言和一些幫助您入門的示例模式。
[abc]
|
單個(gè)字符:a、b 或 c |
[^abc]
|
一個(gè)字符,除了:a、b 或 c |
[a-z]
|
范圍內(nèi)的一個(gè)字符:az |
[^a-z]
|
不在范圍內(nèi)的字符:az |
[0-9]
|
范圍內(nèi)的數(shù)字:0-9 |
[a-zA-Z]
|
范圍內(nèi)的一個(gè)字符:
az 或 AZ |
[a-zA-Z0-9]
|
范圍內(nèi)的一個(gè)字符:
az、AZ 或 0-9 |
a?
|
零個(gè)或一個(gè) |
a*
|
零個(gè)或多個(gè) |
a+
|
一個(gè)或多個(gè) |
[0-9]+
|
0-9 中的一項(xiàng)或多項(xiàng) |
a{3}
|
正好 3 個(gè) |
a{3,}
|
3個(gè)或更多 |
a{3,6}
|
介于 3 和 6 之間 |
a*
|
貪婪量詞 |
a*?
|
惰性量詞 |
a*+
|
所有格量詞 |
轉(zhuǎn)義這些特殊字符 \
.
|
任意單個(gè)字符 |
\s
|
任何空白字符 |
\S
|
任何非空白字符 |
\d
|
任意數(shù)字,同[0-9] |
\D
|
任何非數(shù)字,同[^0-9] |
\w
|
任何單詞字符 |
\W
|
任何非單詞字符 |
\X
|
任何 Unicode 序列,包括換行符 |
\C
|
匹配一個(gè)數(shù)據(jù)單元 |
\R
|
Unicode 換行符 |
\v
|
垂直空白字符 |
\V
|
\v 的否定 - 除了換行符和垂直制表符之外的任何東西 |
\h
|
水平空白字符 |
\H
|
\h 的否定 |
\K
|
重置匹配 |
\n
|
匹配第 n 個(gè)子模式 |
\pX
|
Unicode 屬性 X |
\p{...}
|
Unicode 屬性或腳本類別 |
\PX
|
\pX 的否定 |
\P{...}
|
\p 的否定 |
\Q...\E
|
引用; 視為文字 |
\k<name>
|
匹配子模式 name
|
\k'name'
|
匹配子模式 name
|
\k{name}
|
匹配子模式 name
|
\gn
|
匹配第 n 個(gè)子模式 |
\g{n}
|
匹配第 n 個(gè)子模式 |
\g<n>
|
遞歸第 n 個(gè)捕獲組 |
\g'n'
|
遞歸第 n 個(gè)捕獲組。 |
\g{-n}
|
匹配第 n 個(gè)相對(duì)前一個(gè)子模式 |
\g<+n>
|
遞歸第 n 個(gè)相對(duì)即將到來的子模式 |
\g'+n'
|
匹配第 n 個(gè)相對(duì)即將到來的子模式 |
\g'letter'
|
遞歸命名捕獲組 letter
|
\g{letter}
|
匹配先前命名的捕獲組 letter
|
\g<letter>
|
遞歸命名捕獲組 letter
|
\xYY
|
十六進(jìn)制 YY |
\x{YYYY}
|
十六進(jìn)制字符 YYYY |
\ddd
|
八進(jìn)制字符ddd |
\cY
|
控制字符 Y |
[\b]
|
退格字符 |
\
|
使任何字符文字 |
\G
|
比賽開始 |
^
|
字符串的開始 |
$
|
字符串結(jié)束 |
\A
|
字符串的開始 |
\Z
|
字符串結(jié)束 |
\z
|
字符串的絕對(duì)結(jié)尾 |
\b
|
一個(gè)詞的邊界 |
\B
|
非詞邊界 |
\0
|
完整的比賽內(nèi)容 |
\1
|
捕獲組 1 中的內(nèi)容 |
$1
|
捕獲組 1 中的內(nèi)容 |
${foo}
|
捕獲組中的內(nèi)容 foo
|
\x20
|
十六進(jìn)制替換值 |
\x{06fa}
|
十六進(jìn)制替換值 |
\t
|
標(biāo)簽 |
\r
|
回車 |
\n
|
新隊(duì) |
\f
|
換頁 |
\U
|
大寫轉(zhuǎn)換 |
\L
|
小寫轉(zhuǎn)換 |
\E
|
終止任何轉(zhuǎn)換 |
(...)
|
捕獲所有封閉的東西 |
(a|b)
|
匹配 a 或 b |
(?:...)
|
匹配包含的所有內(nèi)容 |
(?>...)
|
原子組(非捕獲) |
(?|...)
|
重復(fù)的子模式組號(hào) |
(?#...)
|
評(píng)論 |
(?'name'...)
|
命名捕獲組 |
(?<name>...)
|
命名捕獲組 |
(?P<name>...)
|
命名捕獲組 |
(?imsxXU)
|
內(nèi)聯(lián)修飾符 |
(?(DEFINE)...)
|
在使用之前預(yù)定義模式 |
(?(1)yes|no)
|
條件語句 |
(?(R)yes|no)
|
條件語句 |
(?(R#)yes|no)
|
遞歸條件語句 |
(?(R&name)yes|no)
|
條件語句 |
(?(?=...)yes|no)
|
有條件的前瞻 |
(?(?<=...)yes|no)
|
后視條件 |
(?=...)
|
正向預(yù)測(cè) |
(?!...)
|
負(fù)前瞻 |
(?<=...)
|
正面回顧 |
(?<!...)
|
負(fù)面回顧 |
Lookaround 允許您在主模式之前 (lookbehind) 或之后 (lookahead) 匹配一個(gè)組,而不將其包含在結(jié)果中。
g
|
全球的 |
m
|
多線 |
i
|
不區(qū)分大小寫 |
x
|
忽略空格 |
s
|
單線 |
u
|
統(tǒng)一碼 |
X
|
擴(kuò)展 |
U
|
不貪心 |
A
|
錨 |
J
|
重復(fù)的組名 |
(?R)
|
遞歸整個(gè)模式 |
(?1)
|
遞歸第一個(gè)子模式 |
(?+1)
|
遞歸第一個(gè)相對(duì)子模式 |
(?&name)
|
遞歸子模式 name
|
(?P=name)
|
匹配子模式 name
|
(?P>name)
|
遞歸子模式 name
|
[[:alnum:]]
|
[0-9A-Za-z]
|
字母和數(shù)字 |
[[:alpha:]]
|
[A-Za-z]
|
信件 |
[[:ascii:]]
|
[\x00-\x7F]
|
ASCII 碼 0-127 |
[[:blank:]]
|
[\t ]
|
僅空格或制表符 |
[[:cntrl:]]
|
[\x00-\x1F\x7F]
|
控制字符 |
[[:digit:]]
|
[0-9]
|
十進(jìn)制數(shù)字 |
[[:graph:]]
|
[[:alnum:][:punct:]]
|
可見字符(不是空格) |
[[:lower:]]
|
[a-z]
|
小寫字母 |
[[:print:]]
|
[ -~] == [ [:graph:]]
|
可見字符 |
[[:punct:]]
|
[!"#$%&’()*+,-./:;<=>?@[]^_`{|}~]
|
可見標(biāo)點(diǎn)符號(hào) |
[[:space:]]
|
[\t\n\v\f\r ]
|
空白 |
[[:upper:]]
|
[A-Z]
|
大寫字母 |
[[:word:]]
|
[0-9A-Za-z_]
|
文字字符 |
[[:xdigit:]]
|
[0-9A-Fa-f]
|
十六進(jìn)制數(shù)字 |
[[:<:]]
|
[\b(?=\w)]
|
詞的開頭 |
[[:>:]]
|
[\b(?<=\w)]
|
詞尾 |
(*ACCEPT)
|
控制動(dòng)詞 |
(*FAIL)
|
控制動(dòng)詞 |
(*MARK:NAME)
|
控制動(dòng)詞 |
(*COMMIT)
|
控制動(dòng)詞 |
(*PRUNE)
|
控制動(dòng)詞 |
(*SKIP)
|
控制動(dòng)詞 |
(*THEN)
|
控制動(dòng)詞 |
(*UTF)
|
圖案修飾符 |
(*UTF8)
|
圖案修飾符 |
(*UTF16)
|
圖案修飾符 |
(*UTF32)
|
圖案修飾符 |
(*UCP)
|
圖案修飾符 |
(*CR)
|
換行修飾符 |
(*LF)
|
換行修飾符 |
(*CRLF)
|
換行修飾符 |
(*ANYCRLF)
|
換行修飾符 |
(*ANY)
|
換行修飾符 |
\R
|
換行修飾符 |
(*BSR_ANYCRLF)
|
換行修飾符 |
(*BSR_UNICODE)
|
換行修飾符 |
(*LIMIT_MATCH=x)
|
正則表達(dá)式引擎修飾符 |
(*LIMIT_RECURSION=d)
|
正則表達(dá)式引擎修飾符 |
(*NO_AUTO_POSSESS)
|
正則表達(dá)式引擎修飾符 |
(*NO_START_OPT)
|
正則表達(dá)式引擎修飾符 |
ring
|
|
.
|
|
h.o
|
|
ring\?
|
|
\(quiet\)
|
|
c:\\windows
|
匹配
|
使用\
搜索這些特殊字符:
[ \ ^ $ . | ? * + ( ) { }
cat|dog
|
匹配 cat 或者 dog |
id|identity
|
|
identity|id
|
|
當(dāng)備選方案重疊時(shí),從長(zhǎng)到短排序
[aeiou]
|
匹配任何元音 |
[^aeiou]
|
匹配一個(gè)非元音 |
r[iau]ng
|
|
gr[ae]y
|
|
[a-zA-Z0-9]
|
匹配任何字母或數(shù)字 |
在[ ]
總是逃避. \ ]
有時(shí)^ - .
\w
|
“單詞”字符
(字母、數(shù)字或下劃線) |
\d
|
數(shù)字 |
\s
|
空格
(空格、制表符、vtab、換行符) |
\W, \D, or \S
|
不是單詞、數(shù)字或空格 |
[\D\S]
|
表示不是數(shù)字或空格,兩者都匹配 |
[^\d\s]
|
禁止數(shù)字和空格 |
colou?r
|
|
[BW]ill[ieamy's]*
|
匹配 Bill, Willy,
|
[a-zA-Z]+
|
匹配 1 個(gè)或多個(gè)字母 |
\d{3}-\d{2}-\d{4}
|
匹配 SSN |
[a-z]\w{1,7}
|
匹配 UW NetID |
* + {n,}
貪婪的 |
盡可能匹配 |
<.+>
|
找到 1 個(gè)大匹配
|
*? +? {n,}?
懶惰的 |
盡量少搭配 |
<.+?>
|
在 < 中找到 2 個(gè)匹配項(xiàng)
|
\b
|
"單詞”邊緣(在非“單詞”字符旁邊) |
\bring
|
單詞以“ring”開頭,例如
|
ring\b
|
單詞以“ring”結(jié)尾,例如
|
\b9\b
|
匹配單個(gè)數(shù)字
|
\b[a-zA-Z]{6}\b
|
匹配 6 個(gè)字母的單詞 |
\B
|
不是字邊 |
\Bring\B
|
匹配 |
^\d*$
|
整個(gè)字符串必須是數(shù)字 |
^[a-zA-Z]{4,20}$
|
字符串必須有 4-20 個(gè)字母 |
^[A-Z]
|
字符串必須以大寫字母開頭 |
[\.!?"')]$
|
字符串必須以終結(jié)符結(jié)尾 |
?(?i) ?[a-z]*?(?-i) ? |
忽略大小寫 ON / OFF |
(?s) .*(?-s)
|
匹配多行(導(dǎo)致 . 匹配換行符) |
(?m) ^.*;$(?-m)
|
|
(?x)
|
#free-spacing 模式,此 EOL 注釋被忽略 |
(?-x)
|
自由空間模式關(guān)閉 |
/regex/ismx
|
整個(gè)字符串的修改模式 |
(in\|out)put
|
匹配 input 或者 output |
\d{5}(-\d{4})?
|
美國郵政編碼(“+4”可選) |
如果組后匹配失敗,解析器會(huì)嘗試每個(gè)替代方案。
可能導(dǎo)致災(zāi)難性的回溯。
(to) (be) or not \1 \2
|
匹配
|
([^\s])\1{2}
|
匹配非空格,然后再重復(fù)兩次
|
\b(\w+)\s+\1\b
|
匹配雙字 |
on(?:click\|load)
|
比...快:
on(click\|load)
|
盡可能使用非捕獲或原子組
(?>red\|green\|blue)
|
比非捕獲更快 |
(?>id\|identity)\b
|
匹配 id, 但不是 identity |
“id”匹配,但\b
在原子組之后失敗,解析器不會(huì)回溯到組以重試“身份”
如果替代品重疊,則從長(zhǎng)到短排序。
(?= )
|
向前看,如果你能提前找到 |
(?! )
|
向前看,如果你不能提前找到 |
(?<= )
|
回頭看,如果你能找到后面 |
(?<! )
|
回頭看,如果你找不到后面 |
\b\w+?(?=ing\b)
|
匹配 warbling, string, fish ing,... |
\b(?!\w+ing\b)\w+\b
|
不以“ing”結(jié)尾的單詞 |
(?<=\bpre).*?\b
|
匹配 pretend,present,prefix,... |
\b\w{3}(?<!pre)\w*?\b
|
不以“pre”開頭的單詞 |
\b\w+(?<!ing)\b
|
匹配不以“ing”結(jié)尾的單詞 |
匹配 "Mr." 或者 "Ms." 如果單詞“her”在字符串后面
M(?(?=.*?\bher\b)s|r)\.
需要環(huán)視 ?if
? 條件
導(dǎo)入正則表達(dá)式模塊
import re
>>> sentence = 'This is a sample string'
>>> bool(re.search(r'this', sentence, flags=re.I))
True
>>> bool(re.search(r'xyz', sentence))
False
>>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
['par', 'spar', 'spare', 'pare']
>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
['0501', '154', '98234']
>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
>>> [m[0] for m in m_iter if int(m[0]) < 350]
['45', '349', '4', '204']
>>> re.split(r'\d+', 'Sample123string42with777numbers')
['Sample', 'string', 'with', 'numbers']
>>> ip_lines = "catapults\nconcatenate\ncat"
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
* catapults
* concatenate
* cat
>>> pet = re.compile(r'dog')
>>> type(pet)
<class '_sre.SRE_Pattern'>
>>> bool(pet.search('They bought a dog'))
True
>>> bool(pet.search('A cat crossed their path'))
False
re.findall
|
返回包含所有匹配項(xiàng)的列表 |
re.finditer
|
返回一個(gè)可迭代的匹配對(duì)象(每個(gè)匹配一個(gè)) |
re.search
|
如果字符串中的任何位置都匹配,則返回一個(gè) Match 對(duì)象 |
re.split
|
返回一個(gè)列表,其中字符串在每次匹配時(shí)被拆分 |
re.sub
|
用字符串替換一個(gè)或多個(gè)匹配項(xiàng) |
re.compile
|
編譯正則表達(dá)式模式以備后用 |
re.escape
|
返回所有非字母數(shù)字反斜杠的字符串 |
re.I
|
re.IGNORECASE
|
忽略大小寫 |
re.M
|
re.MULTILINE
|
多線 |
re.L
|
re.LOCALE
|
使\w , \b ,\s 語言環(huán)境相關(guān)
|
re.S
|
re.DOTALL
|
點(diǎn)匹配所有(包括換行符) |
re.U
|
re.UNICODE
|
使\w , \b , \d
, \s unicode 依賴
|
re.X
|
re.VERBOSE
|
可讀風(fēng)格 |
let textA = 'I like APPles very much';
let textB = 'I like APPles';
let regex = /apples$/i
// Output: false
console.log(regex.test(textA));
// Output: true
console.log(regex.test(textB));
let text = 'I like APPles very much';
let regexA = /apples/;
let regexB = /apples/i;
// Output: -1
console.log(text.search(regexA));
// Output: 7
console.log(text.search(regexB));
let text = 'Do you like apples?';
let regex= /apples/;
// Output: apples
console.log(regex.exec(text)[0]);
// Output: Do you like apples?
console.log(regex.exec(text).input);
let text = 'Here are apples and apPleS';
let regex = /apples/gi;
// Output: [ "apples", "apPleS" ]
console.log(text.match(regex));
let text = 'This 593 string will be brok294en at places where d1gits are.';
let regex = /\d+/g
// Output: [ "This ", " string will be brok", "en at places where d", "gits are." ]
console.log(text.split(regex))
let regex = /t(e)(st(\d?))/g;
let text = 'test1test2';
let array = [...text.matchAll(regex)];
// Output: ["test1", "e", "st1", "1"]
console.log(array[0]);
// Output: ["test2", "e", "st2", "2"]
console.log(array[1]);
let text = 'Do you like aPPles?';
let regex = /apples/i
// Output: Do you like mangoes?
let result = text.replace(regex, 'mangoes');
console.log(result);
let regex = /apples/gi;
let text = 'Here are apples and apPleS';
// Output: Here are mangoes and mangoes
let result = text.replaceAll(regex, "mangoes");
console.log(result);
preg_match()
|
執(zhí)行正則表達(dá)式匹配 |
preg_match_all()
|
執(zhí)行全局正則表達(dá)式匹配 |
preg_replace_callback()
|
使用回調(diào)執(zhí)行正則表達(dá)式搜索和替換 |
preg_replace()
|
執(zhí)行正則表達(dá)式搜索和替換 |
preg_split()
|
按正則表達(dá)式模式拆分字符串 |
preg_grep()
|
返回匹配模式的數(shù)組條目 |
$str = "Visit Microsoft!";
$regex = "/microsoft/i";
// Output: Visit QuickRef!
echo preg_replace($regex, "QuickRef", $str);
$str = "Visit QuickRef";
$regex = "#quickref#i";
// Output: 1
echo preg_match($regex, $str);
$regex = "/[a-zA-Z]+ (\d+)/";
$input_str = "June 24, August 13, and December 30";
if (preg_match_all($regex, $input_str, $matches_out)) {
// Output: 2
echo count($matches_out);
// Output: 3
echo count($matches_out[0]);
// Output: Array("June 24", "August 13", "December 30")
print_r($matches_out[0]);
// Output: Array("24", "13", "30")
print_r($matches_out[1]);
}
$arr = ["Jane", "jane", "Joan", "JANE"];
$regex = "/Jane/";
// Output: Jane
echo preg_grep($regex, $arr);
$str = "Jane\tKate\nLucy Marion";
$regex = "@\s@";
// Output: Array("Jane", "Kate", "Lucy", "Marion")
print_r(preg_split($regex, $str));
Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");
boolean s1 = m.matches();
System.out.println(s1); // Outputs: true
oolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2); // Outputs: true
boolean s3 = Pattern.matches(".s", "XXXX");
System.out.println(s3); // Outputs: false
CANON_EQ
|
規(guī)范等價(jià) |
CASE_INSENSITIVE
|
不區(qū)分大小寫的匹配 |
COMMENTS
|
允許空格和注釋 |
DOTALL
|
Dotall 模式 |
MULTILINE
|
多行模式 |
UNICODE_CASE
|
Unicode 感知大小寫折疊 |
UNIX_LINES
|
Unix 線路模式 |
還有更多的方法...
替換語句:
String regex = "[A-Z\n]{5}$";
String str = "I like APP\nLE";
Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);
// Outputs: I like Apple!
System.out.println(m.replaceAll("pple!"));
所有匹配項(xiàng)的數(shù)組:
String str = "She sells seashells by the Seashore";
String regex = "\\w*se\\w*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
List<String> matches = new ArrayList<>();
while (m.find()) {
matches.add(m.group());
}
// Outputs: [sells, seashells, Seashore]
System.out.println(matches);
REGEXP
|
字符串是否匹配正則表達(dá)式 |
REGEXP_INSTR()
|
匹配正則表達(dá)式的子字符串的起始索引
(注意:僅限 MySQL 8.0+) |
REGEXP_LIKE()
|
字符串是否匹配正則表達(dá)式
(注意:僅限 MySQL 8.0+) |
REGEXP_REPLACE()
|
替換匹配正則表達(dá)式的子字符串
(注意:僅限 MySQL 8.0+) |
REGEXP_SUBSTR()
|
返回匹配正則表達(dá)式的子字符串
(注意:僅限 MySQL 8.0+) |
expr REGEXP pat
mysql> SELECT 'abc' REGEXP '^[a-d]';
1
mysql> SELECT name FROM cities WHERE name REGEXP '^A';
mysql> SELECT name FROM cities WHERE name NOT REGEXP '^A';
mysql> SELECT name FROM cities WHERE name REGEXP 'A|B|R';
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
1 0
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
a X c
mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
abc X
REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
abc
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
ghi
REGEXP_LIKE(expr, pat[, match_type])
mysql> SELECT regexp_like('aba', 'b+')
1
mysql> SELECT regexp_like('aba', 'b{2}')
0
mysql> # i: case-insensitive
mysql> SELECT regexp_like('Abba', 'ABBA', 'i');
1
mysql> # m: multi-line
mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
1
REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
2
mysql> SELECT regexp_instr('abba', 'b{2}', 2);
2
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
5
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
7
更多建議: