WangQiFei

Keefer


思想提纯
  • 首页
  • 归档
  • 标签
  • 关于
  •     

© 2025  by  Wangqifei

Regex 正则表达式

发布于 2023-06-06 16:06 DEV 

RegularExpression

Regux / Reguxp

语法构成

普通字符

涵盖:大小写字母、数字、标点、特殊符号

打印字符 描述
abc 匹配所有字符中的 abc。注意与[abc]的区别
[abc] 字符簇。匹配所有字符中单个的 a、b 或 c。[a | b | c]
[a-z] 字符簇。匹配所有字符中的任一小写字母。
[A-Z] 字符簇。 匹配所有字符中的任一大写字母。
[0-9] 字符簇。 匹配所有字符中的任一数字。
[^abc] 字符簇。匹配所有字符中非的 a、b 或 c。
. 匹配除换行(\n、\r)之外的任一字符。[^\n\r]
[\s] 匹配所有的空白字符包括换行符、空格、制表符、换页符等。
[\S] 匹配所有的非空白字符不包括换行符、制表符、换页符。[^\f\n\r\t\v]
[\w] 匹配任一数字、字母、下划线 。[0-9a-zA-Z_]
[\W] 匹配任一非单词字符。[^0-9a-zA-Z_]
[\d] 匹配任一数字字符。[0-9]
[\D] 匹配任一非数字字符,包括字母、空格、下划线。[^0-9]

非打印字符

非打印字符 描述
\cx 匹配为 x 字母的控制字符。x 可以是任一字母。
\f 匹配一个换页符。\x0c 、\cL
\n 匹配一个换行符。
\r 匹配一个回车符。
\t 匹配一个制表符。
\v 匹配一个垂直制表符。
\num 匹配正整数 num,对所获取的匹配的引用。

元字符

元字符 描述
^ 匹配整个字符串的开始位置。
$ 匹配整个字符串的结束位置。
* 匹配前一个子表达式零次及以上。{0,}
+ 匹配前一个子表达式一次及以上。{1,}
? 匹配前一个子表达式零次到一次。{0,1}
. 匹配除换行符之外的任一字符。
\ 转义字符。将下一个字符标记为特殊字符、原意字符或向后引用,或八进制转义字符。
() 标记一个组(子表达式)。定义操作符的范围和有限级。选择项必须要放置在()中。
[ 标记一个中括号表达式的开始。
] 标记一个中括号表达式的结束。
{ 标记限定符表达式开始。
} 标记限定符表达式结束。
| 或。匹配前后两项中的任一个。优先级最低。

限定符

表述指定的正则组件必须出现的次数才符合匹配

限定符 描述
* 匹配前一个子表达式零次及以上。{0,}
+ 匹配前一个子表达式一次及以上。{1,}
? 匹配前一个子表达式零次到一次。{0,1}。跟在任一其他限定符后面时,表示匹配模式是非贪婪的,即尽可能少的匹配描述的字符串。
{n} 匹配前一个子表达式 n 次。
{n,} 匹配前一个子表达式 n 次及以上。
{n,m} 匹配前一个子表达式 n 次到 m 次。

定位符(锚点)

定位符 描述
^ 匹配字符串的开始位置。
$ 匹配字符串的结束位置。
\b 匹配一个单词的边界(wordboundary,A word boundary is a zero-width test between two characters)。匹配字符与空格之间的位置。即匹配前一个子表达式且在单词的收尾或开头(取决于\b 放置的位置)
\B 匹配非单词的边界。匹配单词间字符与字符之间的边界。即匹配前一个子表达式且前一个表达式不能在字符串的收尾或开头(取决于\B 放置的位置)

组与引用

()表示捕获分组

() 捕获分组,把每个分组里匹配的值保存起来,多个可通过用 n 表示组的序号来查看

零宽断言

非捕获元 描述
(?:pattern) 非捕获组,创建无法引用的分组。
(?=pattern) 正向预查,在任何开始匹配圆括号内表达式的位置查询。匹配的元素后方紧跟着需要有能匹配括号内表达式匹配到的元素。
(?!pattern) 正向否定预查。在任何不匹配该表达式的位置查询。匹配到的元素后方紧跟着的不能含有括号内表达式匹配的元素。
(?<=pattern) 反向肯定预查。匹配元素的前一个元素是括号表达式陪陪的元素。
(?<!=pattern) 反向否定预查。匹配元素的前一个元素不能是括号表达式陪陪的元素。
示例 描述
r(?=e) 匹配单词中后面有 e 的 r
r(?!e) 匹配单词中后面没有 e 的 r
(?<=e)r 匹配前面有 e 的 r
(?<!=e)r 匹配前面没有 e 的 r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


文本:
<href=\"https://d254.twcdn.xyz/tw/1ea?file=aHRwMjRwKS5tcDQ\" rel=\"nofollow\"></href>
--------------
(pattern) 捕获组
使用pattern匹配文本,并将匹配到的文本保存到一个临时变量中,以便后续引用,一般使用$& $1 引用
eg:
(https?:\/\/)[^\s#.?$/][^\s"]* // https://d254.twcdn.xyz/tw/1ea?file=aHRwMjRwKS5tcDQ\
(https?:\/\/) // https://
https://

--------------
(?:pattern) 非捕获组
使用pattern匹配文本,但不对匹配的结果进行保存。
eg:
(?:https?:\/\/)[^\s#.?$/][^\s"]* // https://d254.twcdn.xyz/tw/1ea?file=aHRwMjRwKS5tcDQ\
(?:https?:\/\/) // https://
--------------
(?=pattern) 正向先行断言(正向断言) //放在匹配表达式的后面作为匹配结果的筛选条件
eg:
\w*(?=\.xyz) // twcdn // 匹配的内容后面紧跟着有.xyz的多个字母
--------------
(?!=pattern) 负向先行断言(负向断言) //放在匹配表达式的后面作为匹配结果的筛选条件
eg:
tw(?!\/) // tw // 文本中有两个tw,这里匹配的是第一个tw(后面跟着/的tw)
--------------
(?<=pattern) 正向后行断言(正向后顾断言) //放在匹配表达式的前面作为匹配结果的筛选条件
eg:
(?<=rel=\\")[^\s]*(?=") // nofollow\
(?<=rel=\\)"[^\s]*" // "nofollow\"
--------------
(?<!=pattern) 负向后行断言(负向后顾断言) //放在匹配表达式的前面作为匹配结果的筛选条件
eg:
(?<!rel=\\)"[^\s]*" // "https://d254.twcdn.xyz/tw/1ea?file=aHRwMjRwKS5tcDQ\"
--------------
**pattern 类型为正则表达 **



flags 标志

flags 放置在 pattern 的后面,可以是多个 flags 同时使用。

标志 描述
i 忽略大小写。
g 全局查找,确保表达式不会在第一个匹配项时停止。
m 多行查找,不启用^和$只匹配整个字符串的开始和结束,而不会单独匹配每一行。
s 默认.匹配的是除换行\n 以外的任一字符,加上 s 后.可以匹配包括换行在內的任一字符。

优先级

优先级 符号
最高 \
高 ()、(?:)、(?=)、[]
中 *、+、?、{n}、{n,}、{n,m}
低 ^、$、中介字符
次低 串联。相邻的字符连接在一起
最低 |

正则表达的解析

sed

shell 的 sed 不支持、\d、\D、零宽断言,且 sed 下的正则表达没有懒惰模式,都是贪婪模式。

Per

可更好的替代 sed 使用。

 上一篇: ADB

© 2025  by  Wangqifei