RegEX

精选 RegEX 常用指令与核心速查备忘单,涵盖高频用法、配置参数与实用技巧。 正则表达式 (RegEx) 语法速查表,涵盖元字符、元字符集、量子限定符、断言匹配及常用Pattern。

#入门指南

#字符集与字符类 (Character Classes)

Pattern 匹配功能说明
[abc] 匹配 a, bc 中的任意单个字符
[^abc] 匹配除了 a, b, c 以外的任意单个字符
[a-z] 匹配 a-z 范围内的任意单个小写字母
[^a-z] 匹配不在 a-z 范围内的任意字符
[0-9] 匹配 0-9 范围内的任意单个数字
[a-zA-Z] 匹配 a-zA-Z 范围内的任意字母
[a-zA-Z0-9] 匹配任意单个字母或数字 (a-z, A-Z, 0-9)

#量词与限定符 (Quantifiers)

Pattern 匹配功能说明
a? 匹配 0 个或 1 个 a (可选)
a* 匹配 0 个或多个 a
a+ 匹配 1 个或多个 a
[0-9]+ 匹配 1 个或多个连续数字
a{3} 精确匹配 3 个 a
a{3,} 匹配 3 个或更多个 a
a{3,6} 匹配 3 到 6 个 a
a* 贪婪匹配 (Greedy)
a*? 懒惰/非贪婪匹配 (Lazy)
a*+ 占有型匹配 (Possessive)

#常用元字符 (Common Metacharacters)

Pattern 说明
^ 匹配字符串开头。
{ 开始表示出现次数的量词。
+ 匹配前面元素的一次或多次。
< 非标准正则元字符(常用于 HTML)。
[ 开始字符类。
* 匹配前面元素的零次或多次。
) 结束捕获组。
> 非标准正则元字符(常用于 HTML)。
. 匹配除换行外的任意字符。
( 开始捕获组。
| 在正则中表示逻辑或。
$ 匹配字符串结尾。
\ 转义元字符,使其表示字面含义。
? 匹配前面元素的零次或一次。

\ 转义这些特殊字符

#转义字符序列

Pattern 说明
. 任意单个字符
\s 任意空白字符
\S 任意非空白字符
\d 任意数字,等同于 [0-9]
\D 任意非数字,等同于 [^0-9]
\w 任意单词字符
\W 任意非单词字符
\X 任意 Unicode 序列(含换行)
\C 匹配一个数据单元
\R Unicode 换行
\v 垂直空白字符
\V \v 的否定 — 除换行与垂直制表符外的任意字符
\h 水平空白字符
\H \h 的否定
\K 重置匹配
\n 匹配第 n 个子模式
\pX Unicode 属性 X
\p{...} Unicode 属性或文字类别
\PX \pX 的否定
\P{...} \p 的否定
\Q...\E 引用;按字面量处理
\k<name> 匹配子模式 name
\k'name' 匹配子模式 name
\k{name} 匹配子模式 name
\gn 匹配第 n 个子模式
\g{n} 匹配第 n 个子模式
\g<n> 递归第 n 个捕获组
\g'n' 递归第 n 个捕获组。
\g{-n} 匹配相对之前的第 n 个子模式
\g<+n> 递归相对之后的第 n 个子模式
\g'+n' 匹配相对之后的第 n 个子模式
\g'letter' 递归命名捕获组 letter
\g{letter} 匹配先前命名的捕获组 letter
\g<letter> 递归命名捕获组 letter
\xYY 十六进制字符 YY
\x{YYYY} 十六进制字符 YYYY
\ddd 八进制字符 ddd
\cY 控制字符 Y
[\b] 退格字符
\ 使任意字符成为字面量

#位置锚定符 (Anchors)

Pattern 说明
\G 匹配起点
^ 字符串开头
$ 字符串结尾
\A 字符串开头
\Z 字符串结尾
\z 字符串绝对结尾
\b 单词边界
\B 非单词边界

#替换变量 (Substitution)

Pattern 说明
\0 完整匹配内容
\1 捕获组 1 的内容
$1 捕获组 1 的内容
${foo} 捕获组 foo 的内容
\x20 十六进制替换值
\x{06fa} 十六进制替换值
\t Tab
\r 回车
\n 换行
\f 换页
\U 转大写
\L 转小写
\E 终止任何大小写转换

#分组捕获 (Group Constructs)

Pattern 说明
(...) 捕获所包围的全部内容
(a|b) 匹配 a 或 b
(?:...) 匹配所包围的全部内容
(?>...) 原子组(非捕获)
(?|...) 复制子模式组编号
(?#...) 注释
(?'name'...) 命名捕获组
(?<name>...) 命名捕获组
(?P<name>...) 命名捕获组
(?imsxXU) 内联修饰符
(?(DEFINE)...) 在使用前预定义模式

#条件断言 (Assertions)

- -
(?(1)yes|no) 条件语句
(?(R)yes|no) 条件语句
(?(R#)yes|no) 递归处理 条件语句
(?(R&name\yes|no) 条件语句
(?(?=...)yes|no) 前瞻条件
(?(?<=...)yes|no) 后顾条件

#环视/前瞻后顾 (Lookarounds)

- -
(?=...) 正向先行断言
(?!...) 负向先行断言
(?<=...) 正向后行断言
(?<!...) 负向后行断言

Lookaround lets you match a group before (lookbehind) or after (lookahead) your main pattern without including it in the result.

#标志位参数 (Flags)/Modifiers

Pattern 说明
g 全局
m 多行
i 不区分大小写
x 忽略空白
s 单行
u Unicode
X 扩展模式
U 非贪婪
A 锚定
J 允许重复组名

#递归匹配 (Recurse)

- -
(?R) 递归整个模式
(?1) 递归第一个子模式
(?+1) 递归第一个相对子模式
(?&name) 递归子模式 name
(?P=name) 匹配子模式 name
(?P>name) 递归子模式 name

#POSIX 字符集

字符类 等同于 含义
[[:alnum:]] [0-9A-Za-z] 字母与数字
[[:alpha:]] [A-Za-z] 字母
[[:ascii:]] [\x00-\x7F] ASCII 码 0-127
[[:blank:]] [\t ] 仅空格或制表符
[[:cntrl:]] [\x00-\x1F\x7F] 控制字符
[[:digit:]] [0-9] 十进制数字
[[:graph:]] [[:alnum:][:punct:]] 可见字符(不含空格)
[[:lower:]] [a-z] 小写字母
[[:print:]] [ -~] == [ [:graph:]] 可见字符
[[:punct:]] [!"#$%&’()*+,-./:;<=>?@[]^_`{|}~] 可见标点字符
[[:space:]] [\t\n\v\f\r ] 空白
[[:upper:]] [A-Z] 大写字母
[[:word:]] [0-9A-Za-z_] 单词字符
[[:xdigit:]] [0-9A-Fa-f] 十六进制数字
[[:<:]] [\b(?=\w)] 单词开头
[[:>:]] [\b(?<=\w)] 单词结尾

#控制动词 (Control Verb)

- -
(*ACCEPT) 控制动词
(*FAIL) 控制动词
(*MARK:NAME) 控制动词
(*COMMIT) 控制动词
(*PRUNE) 控制动词
(*SKIP) 控制动词
(*THEN) 控制动词
(*UTF) Pattern modifier
(*UTF8) Pattern modifier
(*UTF16) Pattern modifier
(*UTF32) Pattern modifier
(*UCP) Pattern modifier
(*CR) 换行修饰符
(*LF) 换行修饰符
(*CRLF) 换行修饰符
(*ANYCRLF) 换行修饰符
(*ANY) 换行修饰符
\R 换行修饰符
(*BSR_ANYCRLF) 换行修饰符
(*BSR_UNICODE) 换行修饰符
(*LIMIT_MATCH=x) 正则引擎修饰符
(*LIMIT_RECURSION=d) 正则引擎修饰符
(*NO_AUTO_POSSESS) 正则引擎修饰符
(*NO_START_OPT) 正则引擎修饰符

#常用正则实战示例

#字符匹配示例

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

Use \ to search for these special characters:
[ \ ^ $ . | ? * + ( ) { }

#分支选择示例

Pattern 匹配
cat|dog 匹配 catdog
id|identity 匹配 ididentity
identity|id 匹配 ididentity

Order longer to shorter when alternatives overlap

#字符集示例

Pattern 匹配
[aeiou] 匹配任意元音
[^aeiou] 匹配非元音
r[iau]ng 匹配 ring、wrangle、sprung
gr[ae]y 匹配 graygrey
[a-zA-Z0-9] 匹配任意字母或数字
[\u3a00-\ufa99] Match any Unicode Hàn (中文)

In [ ] always escape . \ ] and sometimes ^ - .

#快捷字符集示例

Pattern 含义
\w “单词”字符
(字母、数字或下划线)
\d 数字
\s 空白
(空格、制表符、垂直制表符、换行)
\W, \D, or \S 非单词、数字或空白
[\D\S] 表示非数字或非空白,两者都匹配
[^\d\s] 禁止数字与空白

#匹配次数示例

Pattern 匹配
colou?r 匹配 colorcolour
[BW]ill[ieamy's]* 匹配 BillWillyWilliam's
[a-zA-Z]+ 匹配 1 个或多个字母
\d{3}-\d{2}-\d{4} 匹配 SSN(社会安全号)
[a-z]\w{1,7} 匹配 UW NetID

#贪婪与懒惰匹配对比

Pattern 含义
* + {n,}
greedy
尽可能多地匹配
<.+> <b>bold</b> 中找到 1 个大匹配
*? +? {n,}?
lazy
尽可能少地匹配
<.+?> 在 <b>bold</b> 中找到 2 个匹配

#作用域示例

Pattern 含义
\b “单词”边界(紧邻非“单词”字符)
\bring 以 "ring" 开头的单词,如 ringtone
ring\b 以 "ring" 结尾的单词,如 spring
\b9\b 匹配单个数字 9,而非 199199
\b[a-zA-Z]{6}\b 匹配 6 个字母的单词
\B 非单词边界
\Bring\B 匹配 springswringer
^\d*$ 整个字符串必须全是数字
^[a-zA-Z]{4,20}$ 字符串必须有 4–20 个字母
^[A-Z] 字符串必须以大写字母开头
[\.!?"')]$ 字符串必须以句末标点结尾

#修饰符示例

Pattern 含义
(?i)[a-z]*(?-i) 忽略大小写 开/关
(?s).*(?-s) 匹配多行(使 . 可匹配换行)
(?m)^.*;$(?-m) ^$ 匹配行首/行尾而非整串
(?x) #自由空白模式,此行尾注释被忽略
(?-x) 关闭自由空白模式
/regex/ismx 修改整串匹配模式

#捕获分组示例

Pattern 含义
(in|out)put 匹配 inputoutput
\d{5}(-\d{4})? US zip code ("+ 4" 可选)

Parser tries EACH alternative if match fails after group.
Can lead to catastrophic backtracking.

#反向引用示例

Pattern 匹配
(to) (be) or not \1 \2 匹配 to be or not to be
([^\s])\1{2} 匹配非空格,再重复两次相同内容   aaa...
\b(\w+)\s+\1\b 匹配重复单词

#非捕获分组示例

Pattern 含义
on(?:click|load) 比下列更快:
on(click\|load)

Use non-capturing or atomic groups when possible

#原子分组示例

Pattern 含义
(?>red|green|blue) 比非捕获组更快
(?>id|identity)\b 匹配 id,但不匹配 identity

"id" matches, but \b fails after atomic group, parser doesn't backtrack into group to retry 'identity'

If alternatives overlap, order longer to shorter.

#环视断言示例

Pattern 含义
(?= ) 先行断言:若前方能找到
(?! ) 先行断言:若前方找不到
(?<= ) 后行断言:若后方能找到
(?<! ) 后行断言:若后方找不到
\b\w+?(?=ing\b) 匹配 warbling、string、fishing 等
\b(?!\w+ing\b)\w+\b 不以 ing 结尾的单词
(?<=\bpre).*?\b 匹配 pretend、present、prefix
\b\w{3}(?<!pre)\w*?\b 不以 pre 开头的单词
\b\w+(?<!ing)\b 匹配不以 ing 结尾的单词

#条件判断表达式

Match "Mr." or "Ms." if word "her" is later in string

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

requires lookaround for IF condition

#Python 正则表达式用法

#快速入门

Import the regular expressions module

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

re.compile()

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

#自定义函数 (Functions)

函数 说明
re.findall 返回包含全部匹配的列表
re.finditer 返回匹配对象的可迭代对象(每个匹配一个)
re.search 若字符串中任意位置有匹配则返回 Match 对象
re.split 返回按每次匹配处拆分后的列表
re.sub 用字符串替换一次或多次匹配
re.compile 编译Pattern以供稍后使用
re.escape 返回所有非字母数字均已反斜杠转义的字符串

#标志位参数 (Flags)

- - -
re.I re.IGNORECASE 忽略大小写
re.M re.MULTILINE 多行
re.L re.LOCALE 使 \w\b\s 依赖 locale
re.S re.DOTALL 点号匹配全部 (含换行)
re.U re.UNICODE 使 \w\b\d\s 依赖 Unicode
re.X re.VERBOSE 可读风格

#JavaScript 正则表达式用法

#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 正则表达式用法

#自定义函数 (Functions)

- -
preg_match() 执行正则匹配
preg_match_all() 执行全局正则匹配
preg_replace_callback() 使用回调执行正则搜索替换
preg_replace() 执行正则搜索替换
preg_split() 按Pattern拆分字符串
preg_grep() 返回匹配模式的数组条目

#preg_replace 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数

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

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

#preg_match 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数

$str = "Visit CheatSheets";
$regex = "#cheatsheets#i";

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

#preg_match 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数 函数_all 函数

$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 正则表达式用法

#代码风格示例

First way

Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");
boolean s1 = m.matches();
System.out.println(s1);   // Outputs: true

Second way

boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2);   // Outputs: true

Third way

boolean s3 = Pattern.matches(".s", "XXXX");
System.out.println(s3);   // Outputs: false

#Pattern 编译标志

- -
CANON_EQ 规范等价
CASE_INSENSITIVE 忽略大小写 matching
COMMENTS 允许空白与注释
DOTALL Dotall 模式
MULTILINE 多行模式
UNICODE_CASE Unicode 感知的大小写折叠
UNIX_LINES Unix 行模式

#Matcher 核心方法

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

There are more methods ...

#综合示例 (Examples)

Replace sentence:

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

Array of all matches:

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 正则表达式用法

#自定义函数 (Functions)

名称 说明
REGEXP 字符串是否匹配正则
REGEXP_INSTR() 匹配正则的子串起始索引
(注意:仅 MySQL 8.0+)
REGEXP_LIKE() 字符串是否匹配正则
(注意:仅 MySQL 8.0+)
REGEXP_REPLACE() 替换匹配正则的子串
(注意:仅 MySQL 8.0+)
REGEXP_SUBSTR() 返回匹配正则的子串
(注意:仅 MySQL 8.0+)

#REGEXP 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符 运算符

expr REGEXP pat

使用示例 (Examples)

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

使用示例 (Examples)

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

使用示例 (Examples)

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

使用示例 (Examples)

mysql> SELECT regexp_like('aba', 'b+')
1
mysql> SELECT regexp_like('aba', 'b{2}')
0
mysql> # i: 忽略大小写
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]]]])

使用示例 (Examples)

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