正则学习笔记

在线工具

https://regexr.com (极力推荐)

学习笔记

以下功能在编译器中也很好用, 可以多用用.

基本字符匹配规则

  1. "." 不匹配换行字符, 但是\s是否包含换行字符, 我们需要实际去验证
    2."." 包含的字符号包括很多, 途中无法中正则字符表示的未画出 如 (){}[]...等
  2. 每个基本的匹配字符只匹配一个字符.需要匹配多个, 需要配合量词使用.
bash 复制代码
- .的使用
.在正则表达式中表示匹配除了换行符之外的任意一个字符(注意除了换行符,和任意一个字符)
> ab. 表示ab后边跟着任意一个非换行符的字符.
> .ab 表示ab前边跟着任意一个非换行符的字符. 
> a.b 表示a和b之间夹着任意一个非换行符的字符. 

- [] 的使用(字符集合)
> ab[ces03AB] 表示匹配 (abc abe abs ab0 ab3 abA abB)
> ab[a-z] 表示匹配 (aba, abb, abc .... abz)
> ab[a-zA-Z0-9,-] 表示匹配 (aba....abz....abA....abZ....ab0....ab9....ab,....ab-) 范围内的字符串
> ab[^a-c] 表示取反, 也就 前边是ab,后边是除了(a b c)以外的任何字符都可以, 如abd ab0 等.
>> 注意: [.*$] 括号中的这部分单纯表示字符. 不具备特殊的意义
>> 注意: [^] 当^ 不在开始位置的时候, 也仅表示普通字符, 只有位于开始位置才表示其特殊含义 如 [^a], 如果想放在开始位置, 又想当做普通字符, 可以使用\转义, 如[\^a]
>>> 注意: [\] \表示转义, 如果相匹配\ 可以使用双斜线表示, 如 [\\]

- \d 表示匹配一个数字, \D 表示匹配一个非数字 = [^\d]
>  ab\d 表示 ab后边跟着一个数, 比如 (ab0....ab0)
>  ab\D 表示 ab后边跟着一个非数字, 比如 (ab=....ab-)

- \w 表示匹配一个字母或者数组或者下划线, \W 表示一个匹配非字母或者数组或者下划线  = [^\w]
>  ab\w 表示 ab后边跟着一个字母或数字或下划线, 比如 (ab0....ab9....aba....abz....abA....abZ....ab_)
>  ab\W 表示 ab后边跟着一个非字母数字下划线 比如 (ab-....ab=)

-\s 表示匹配一个空白字符, \S 表示匹配一个非空白字符  = [^\s]
> ab\s 表示匹配 ab后边跟着一个空白字符, 比如 (ab ....ab	)
> ab\S 表示匹配 ab后边跟着一个非空白字符, 比如 (ab0....abs....ab=)

-\ 表示给某给字符转义
> ab\. 表示匹配 (ab.)
> ab\* 表示匹配 (ab*)

位置和边界匹配

bash 复制代码
- ^ 表示匹配以某个字符开始的字符串
> /^a/g 表示匹配全文以 a 开头的字符串. 
> /^a/gm 表示匹配每一行以 a 开头的字符串. 

- $ 表示匹配以某个字符结束的字符串
> /a$/g 表示匹配全文以 a 结束的字符串. 
> /a$/gm 表示匹配每一行以 a 结束的字符串. 

-\b 表示单词的开头或结尾, \B 表示非单词的开头和结尾
> \babc\b 表示匹配独立的单词, 必须在开始和结尾 abc(sabc 不算)
> \Babc\B 表示匹配非独立的单词, 必须abc在单词中且不在开始和结尾 sabcs(sabc和abcs不算)

量词

表示重复次数

bash 复制代码
- + 表示重复1次或者多次 >= 1 次 = {1,}
> ab+ 表示匹配a后边有>=1个b的字符串,直到匹配到第一个后边不是b的字符为止 比如 (ab....abb....abbb)

- * 表示重复0次或者多次 >= 0 次 = {0,}
> > ab* 表示匹配a后边有>=0个b的字符串,直到匹配到第一个后边不是b的字符为止 比如 (a....ab....abb....abbb)

- ? 表示重复0次或者1次 <= 1 次 = {0,1}
> ab? 表示匹配a后边有<=1个b的字符串,直到匹配到第一个后边不是b的字符为止 比如 (a....ab)

- {} 表示重复括号内的次数的
> ab{3} 表示匹配a后边有3个b的字符串. 仅匹配(abbb)
> ab{3, 5} 表示匹配a后边有3 - 5个b的字符串. 如( abbb....abbbb....abbbbb)
> ab{3,} 表示匹配a后边有3 - 无穷个b的字符串 直到匹配到第一个非b的字符. 如( abbb....abbbb....abbbbb....abbbbb....)
> ab{0,2} 表示匹配a后边有0-2个b的字符串  如( a....ab....abb)

分组和捕获

bash 复制代码
- () 表示()的内容被重复了多次
> (ab)* 表示匹配ab被重复了多次, 如(ab....abababab.... abab)

- (|) 表示或者的关系
> ab(C|c) 表示匹配 abc 或者 abC
> (ab|ac)(ddd|DDD) 表示匹配 abddd 或者 abDDD 或者 acddd 或者 acDDD
> ab|ac(ddd|DDD) 表示匹配 ab 或者 acddd 或者 acDDD
- ()内容的捕获
> 假如有数据 2025-01-01 2025-01-02 2025-01-03 2025-01-04 2025-01-05 使用 \d{4}-\d{1,2}-\d{1,2} 表示匹配现有的日期数据 然后使用()分组后则变成(\d{4})-(\d{1,2})-(\d{1,2}), 这时候使用$1 取第一部分, 即2025, 使用$2 取第二部分, 即01, 使用$3匹配第三部分,即01或者02或者03或者04或者05 此时替换为 $3-$2-$1则得到 01-01-2025 02-01-2025 03-01-2025 04-01-2025 05-01-2025 
> 假如有数据 2025-01-01 2025/01/02 2025.01.03 2025_01_04 2025 01 05 20250106 使用()分组后则变成(\d{4})[-/._\s]?(\d{1,2})[-/._\s]?(\d{1,2}), 这时候使用$1 取第一部分, 即2025, 使用$2 取第二部分, 即01, 使用$3匹配第三部分,即01或者02或者03或者04或者05 此时替换为 $3-$2-$1则得到 01-01-2025 02-01-2025 03-01-2025 04-01-2025 05-01-2025 06-01-2025
>> 注意使用 (\d{4})[-/._\s]*(\d{1,2})[-/._\s]*(\d{1,2}) 和 (\d{4})[-/._\s]?(\d{1,2})[-/._\s]?(\d{1,2}) 和 (\d{4})[-/._\s]+(\d{1,2})[-/._\s]+(\d{1,2}) 效果不同, * 表示匹配 > = 0 次, + 表示 >= 1 次, ? 表示 <= 1 次. 本示例中前两个效果是一致的.

> 使用()只分组不捕获, 可将上述的正则改为(\d{4})-(?:\d{1,2})-(\d{1,2}) 这表示第二部分是一个非捕获分组, 此时  这时候使用$1 取第一部分, 即2025,  使用$2匹配第三部分,则变成01或者02或者03或者04或者05

- ()表示引用, 可以引用之前匹配到的内容
> 加入有数据 abxxab acxxac abxxxac ababxxxxabab abxxxxa, 我们希望匹配待到单词的开始和结束是相同的内容的字符串, 可以使用 
>>  \b((ab|ac))\w*\1\b 以ab或者ac开头, 且结尾和开头使用相同的字符串, 此时匹配到 (abxxab....acxxac....ababxxxxabab)
>>  \b(\w){1}\w*\1\b 单词的开始和结尾使用相同的1个字符, 此时匹配到 (abxxxxa)
>>  \b(\w){2}\w*\1\b 单词的开始和结尾使用相同2的字符,此时匹配到 (abxxab....acxxac....ababxxxxabab)
>>  \b(\w+)\w*\1\b 单词的开始和结尾使用相同的至少1个字符,此时匹配到 (abxxab....acxxac....ababxxxxabab....abxxxxa)

前瞻和后顾

用户匹配到某些字符前边或者后边的内容, 但是不包含字符本身

bash 复制代码
(?=) 表示正向前瞻
> 假如有数据 &100 *200 $aaa %bbb !100, 我们希望匹配四个符号中到哪几个符号后边紧跟数字, 可以使用 [&*$%](?=\d+), 此时只会匹配到 (&....*), 来自(&100....*200)

(?!) 表示负向前瞻
> 假如有数据 &100 *200 $aaa %bbb !100, 我们希望匹配四个符号中到哪几个符号后边紧跟的不是数字, 可以使用 [&*$%](?!\d+), 此时只会匹配到 ($....%), 来自($aaa....%bbb)

(?<=) 表示正向后顾
> 假如有数据 &100 *200 $aaa %bbb !100, 我们希望匹配到四个符号后紧跟着的的数字, 可以使用 (?<=[&*$%])\d+, 此时只会匹配到 (100....200), 来自(&100....*200)

(?<!) 表示负向后顾

> 假如有数据 &100 *200 $aaa %bbb !100, 我们希望匹配到不是这四个符号后紧跟着的的数字, 可以使用(?<![&*$%])\d+, 此时只会匹配到 (00....00....100), 来自(&100....*200....!100)

贪婪匹配和非贪婪匹配

贪婪匹配会匹配到包含内容最多的符合条件的内容, 非贪婪匹配会匹配到包含内容最少的符合条件的内容, 默认是贪婪匹配

通常使用? 来处理贪婪匹配和非贪婪匹配, ? 通常放在量词后边, 如*? 或者 +?

bash 复制代码
- 比如字符串 <span>abc</span><span>abcs</span>, 我希望匹配  <span></span>标签中的内容
> 贪婪匹配 (?<=<span>).*(?=<\/span>) 匹配到的内容是 (abc</span><span>abcs)
> 非贪婪匹配 (?<=<span>).*?(?=<\/span>) 匹配到的内容是 (abc....abcs)
相关推荐
幺零九零零2 小时前
压测学习-JMeter( 二)
学习·jmeter
week_泽2 小时前
5、OpenCV SIFT特征描述子笔记
人工智能·笔记·opencv
阿豪只会阿巴2 小时前
【多喝热水系列】从零开始的ROS2之旅——Day 1
笔记·ros2
你要飞2 小时前
第十四课:考研阅读方法论
笔记·考研
摇滚侠2 小时前
Java 零基础全套视频教程,String StringBuffer StringBuilder 类,笔记142-144、146
java·开发语言·笔记
小智RE0-走在路上2 小时前
Python学习笔记(13) --Mysql,Python关联数据库
数据库·python·学习
week_泽2 小时前
6、OpenCV SURF特征检测笔记
人工智能·笔记·opencv
Lv11770083 小时前
Visual Studio中的try -- catch
ide·笔记·c#·visual studio
m0_638079623 小时前
电气工程及其自动化导论(课程论文/报告)
学习·学习方法