正則表達(dá)式 備忘單

2021-08-31 10:44 更新

正則表達(dá)式 (regex) 的快速參考,包括符號(hào)、范圍、分組、斷言和一些幫助您入門的示例模式。

開始

介紹

這是開始使用正則表達(dá)式的快速備忘單。

字符類

[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ì)即將到來(lái)的子模式
\g'+n' 匹配第 n 個(gè)相對(duì)即將到來(lái)的子模式
\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 換頁(yè)
\U 大寫轉(zhuǎn)換
\L 小寫轉(zhuǎn)換
\E 終止任何轉(zhuǎn)換

組構(gòu)造

(...) 捕獲所有封閉的東西
(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) 條件語(yǔ)句
(?(R)yes|no) 條件語(yǔ)句
(?(R#)yes|no) 遞歸條件語(yǔ)句
(?(R&name)yes|no) 條件語(yǔ)句
(?(?=...)yes|no) 有條件的前瞻
(?(?<=...)yes|no) 后視條件

環(huán)視

(?=...) 正向預(yù)測(cè)
(?!...) 負(fù)前瞻
(?<=...) 正面回顧
(?<!...) 負(fù)面回顧

Lookaround 允許您在主模式之前 (lookbehind) 或之后 (lookahead) 匹配一個(gè)組,而不將其包含在結(jié)果中。

標(biāo)志/修飾符

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

POSIX 字符類

[[: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)] 詞尾

控制動(dòng)詞

(*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á)式引擎修飾符

正則表達(dá)式示例

人物

ring 匹配 ring springboard
. 匹配  a9+ 等等。
h.o 匹配 hooh2oh/o 等等。
ring\? 匹配 ring?
\(quiet\) 匹配 (quiet)
c:\\windows 匹配   c:\windows

使用\搜索這些特殊字符:
[ \ ^ $ . | ? * + ( ) { }

備擇方案

cat|dog 匹配 cat 或者 dog
id|identity 匹配 id  或者 identity
identity|id 匹配 id  或者 identity

當(dāng)備選方案重疊時(shí),從長(zhǎng)到短排序

字符類

[aeiou] 匹配任何元音
[^aeiou] 匹配一個(gè)非元音
r[iau]ng 匹配  ring, wrangle, sprung, 等等。
gr[ae]y 匹配 gray   或者 
[a-zA-Z0-9] 匹配任何字母或數(shù)字

[ ]總是逃避. \ ]有時(shí)^ - .

速記班

\w “單詞”字符
(字母、數(shù)字或下劃線)
\d 數(shù)字
\s 空格
(空格、制表符、vtab、換行符)
\W, \D, or \S 不是單詞、數(shù)字或空格
[\D\S] 表示不是數(shù)字或空格,兩者都匹配
[^\d\s] 禁止數(shù)字和空格

發(fā)生次數(shù)

colou?r 匹配  color 或者 colour
[BW]ill[ieamy's]* 比賽 Bill, Willy,  William's   等等。
[a-zA-Z]+ 匹配 1 個(gè)或多個(gè)字母
\d{3}-\d{2}-\d{4} 匹配 SSN
[a-z]\w{1,7} 匹配 UW NetID

貪婪與懶惰

* + {n,}
貪婪的
盡可能匹配
<.+> 找到 1 個(gè)大匹配 <b>粗體</b>
*? +? {n,}?
懶惰的
盡量少搭配
<.+?> 在 < 中找到 2 個(gè)匹配項(xiàng) >粗體< /b >

范圍

\b “單詞”邊緣(在非“單詞”字符旁邊)
\bring 單詞以“ring”開頭,例如 鈴聲
ring\b 單詞以“ring”結(jié)尾,例如 春天
\b9\b 匹配單個(gè)數(shù)字 9 ,而不是 19、91、99 等。
\b[a-zA-Z]{6}\b 匹配 6 個(gè)字母的單詞
\B 不是字邊
\Bring\B 匹配 springs 和  wringer
^\d*$ 整個(gè)字符串必須是數(shù)字
^[a-zA-Z]{4,20}$ 字符串必須有 4-20 個(gè)字母
^[A-Z] 字符串必須以大寫字母開頭
[\.!?"')]$ 字符串必須以終結(jié)符結(jié)尾

修飾符

(?i)[az]*(?-i) 忽略大小寫 ON / OFF
(?s).*(?-s) 匹配多行(導(dǎo)致 . 匹配換行符)
(?m)^.*;$(?-m) ^ & $ 匹配行而不是整個(gè)字符串
(?x) #free-spacing 模式,此 EOL 注釋被忽略
(?-x) 自由空間模式關(guān)閉
/正則表達(dá)式/ismx 整個(gè)字符串的修改模式

(in\|out)put 匹配 input 或者 output
\d{5}(-\d{4})? 美國(guó)郵政編碼(“+4”可選)

如果組后匹配失敗,解析器會(huì)嘗試每個(gè)替代方案。
可能導(dǎo)致災(zāi)難性的回溯。

反向引用

(to) (be) or not \1 \2 比賽 生存還是毀滅
([^\s])\1{2} 匹配非空格,然后再重復(fù)兩次   aaa , ...
\b(\w+)\s+\1\b 匹配雙字

非捕獲組

on(?:click\|load) 比...快:
on(click\|load)

盡可能使用非捕獲或原子組

原子團(tuán)

(?>red\|green\|blue) 比非捕獲更快
(?>id\|identity)\b 匹配 id, 但不是 id 實(shí)體

“id”匹配,但\b在原子組之后失敗,解析器不會(huì)回溯到組以重試“身份”

如果替代品重疊,則從長(zhǎng)到短排序。

環(huán)視四周

(?= ) 向前看,如果你能提前找到
(?! ) 向前看,如果你不能提前找到
(?<= ) 回頭看,如果你能找到后面
(?<! ) 回頭看,如果你找不到后面
\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é)尾的單詞

If-then-else

匹配 "Mr." 或者 "Ms."  如果單詞“her”在字符串后面

M(?(?=.*?\bher\b)s|r)\.

需要環(huán)視 ?if? 條件

Python 中的正則表達(dá)式

入門

導(dǎo)入正則表達(dá)式模塊

import re

例子

re.search()

>>> 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()

>>> 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']

re.finditer()

>>> 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()

>>> re.split(r'\d+', 'Sample123string42with777numbers')
['Sample', 'string', 'with', 'numbers']

re.sub()

>>> 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ù)字反斜杠的字符串

Flags

re.I re.IGNORECASE 忽略大小寫
re.M re.MULTILINE 多線
re.L re.LOCALE 使\w, \b,\s 語(yǔ)言環(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)格

JavaScript 中的正則表達(dá)式

test()

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));

exec()

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);

match()

let text = 'Here are apples and apPleS';
let regex = /apples/gi;
 
// Output: [ "apples", "apPleS" ]
console.log(text.match(regex));

split()

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))

matchAll()

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]);

replace()

let text = 'Do you like aPPles?';
let regex = /apples/i
 
// Output: Do you like mangoes?
let result = text.replace(regex, 'mangoes');
console.log(result);

replaceAll()

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);

PHP 中的正則表達(dá)式

方法

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ù)組條目

preg_replace

$str = "Visit Microsoft!";
$regex = "/microsoft/i";

// Output: Visit QuickRef!
echo preg_replace($regex, "QuickRef", $str); 

preg_match

$str = "Visit QuickRef";
$regex = "#quickref#i";

// Output: 1
echo preg_match($regex, $str);

preg_matchall

$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]);
}

preg_grep

$arr = ["Jane", "jane", "Joan", "JANE"];
$regex = "/Jane/";

// Output: Jane
echo preg_grep($regex, $arr);

preg_split

$str = "Jane\tKate\nLucy Marion";
$regex = "@\s@";

// Output: Array("Jane", "Kate", "Lucy", "Marion")
print_r(preg_split($regex, $str));

Java 中的正則表達(dá)式

樣式

第一種方式

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 線路模式

方法

Pattern

  • Pattern compile(String regex [, int flags])
  • boolean matches([String regex, ] CharSequence input)
  • String[] split(String regex [, int limit])
  • String quote(String s)

Matcher

  • int start([int group | String name])
  • int end([int group | String name])
  • boolean find([int start])
  • String group([int group | String name])
  • Matcher reset()

String

  • boolean matches(String regex)
  • String replaceAll(String regex, String replacement)
  • String[] split(String regex[, int limit])

還有更多的方法...

例子

替換語(yǔ)句:

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);

MySQL 中的正則表達(dá)式

方法

Name Description
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+)

REGEXP

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

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

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

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

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)