目录
- 入门挑战
- 非贪婪模式
- [任意字符 .](#任意字符 . "#%E4%BB%BB%E6%84%8F%E5%AD%97%E7%AC%A6--")
- [可选字符 ?](#可选字符 ? "#%E5%8F%AF%E9%80%89%E5%AD%97%E7%AC%A6-")
- 单词边界
- 分组
- 非捕获分组
- 或者条件
- 分组的回溯引用
- 正向先行断言
- 反向先行断言
- 正向后行断言
- 反向后行断言
学习正则表达式(Regular Expressions,简称"regex")有着多方面的好处,尤其对于程序员、数据科学家以及任何需要进行文本处理的人来说。正则表达式是一种强大的文本匹配工具,它可以帮助你以高效、灵活的方式完成各种复杂的文本处理任务。以下是学习正则表达式的一些主要原因:
- 文本搜索与替换: 正则表达式可以用来在文本或代码中搜索特定模式的字符串,并能够用其他字符串替换它们。这在编辑大型文本文件或进行代码重构时非常有用。
- 数据验证: 它们可以用来验证输入数据的格式,例如检查一个字符串是否符合电子邮件地址、电话号码、身份证号等特定格式的要求。
- 文本解析: 正则表达式可以帮助你从复杂的文本数据中提取有用的信息,比如从日志文件中提取特定事件的详细信息,或者从网页代码中提取链接。
- 编程语言跨平台性: 绝大多数编程语言都支持正则表达式,学习它可以让你在不同的编程环境中都能够进行有效的字符串处理。
- 提高效率: 尽管学习正则表达式的语法可能需要一些时间,但一旦掌握,它可以大大提高你处理文本任务的效率,让你能够用几行代码解决复杂的问题。
- 自动化处理: 在进行批量文件处理、日志分析、自动化测试等任务时,正则表达式是不可或缺的工具,它可以帮助你自动化许多手动处理过程中的步骤。
- 提升编程能力: 学习和使用正则表达式也是一个提升逻辑思维和编程技能的过程。它要求你以一种更抽象和精确的方式思考问题。
虽然正则表达式的语法在初学者看来可能有些复杂和晦涩,但其强大的功能和广泛的应用场景使得投入时间学习它是非常值得的。熟练掌握正则表达式将是你编程技能库中一个非常有用的工具。
备忘录
实例 | 描述 |
---|---|
. |
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
? |
匹配一个字符零次或一次,另一个作用是非贪婪模式 。相当于{0,1} |
+ |
匹配1次或多次,相当于{1,} |
* |
匹配0次或多次,相当于 {0,} |
\b |
匹配一个长度为0 的子串 |
\d |
匹配一个数字字符。等价于 [0-9]。 |
\D |
匹配一个非数字字符。等价于 [^0-9]。 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w |
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9 _]'。 |
\W |
匹配任何非单词字符。等价于 '[^A-Za-z0-9 _]'。 |
非贪婪模式
通过在相应的量词后面添加一个问号 ?
来实现的。
*
(贪婪)变成*?
(非贪婪),表示匹配前面的元素零次或多次,但尽量少地匹配。+
(贪婪)变成+?
(非贪婪),表示匹配前面的元素一次或多次,但尽量少地匹配。?
(贪婪)变成??
(非贪婪),表示匹配前面的元素零次或一次,但尽量少地匹配。{n,m}
(贪婪)变成{n,m}?
(非贪婪),表示匹配前面的元素至少 n 次,但不超过 m 次,且尽量少地匹配。
非贪婪模式
贪婪模式
任意字符 .
.
字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: .
字符只有一个不能匹配的字符,也就是换行符(\n
)
可选字符 ?
有时,我们可能想要匹配一个单词的不同写法,比如color
和colour
,或者honor
与honour
。
这个时候我们可以使用 ?
符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
在这里 u?
表示u
是可选的,即可以出现也可以不出现,可以匹配的是 honor
和 honour
。
.?
的意思是匹配任何单个字符或者没有字符。这意味着,它可以匹配任何单个字符(包括空格、英文字母、数字、标点符号等)也可以匹配空字符串(即长度为0的字符串)。
单词边界 \b
\b
匹配的是单词的边界,
eg:\bmaster\b
就仅匹配有边界的master
单词。
分组 ()
分组使用()
表达。当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
凡间解释 用来获取匹配字符串
eg1
非捕获分组 (?:)
非捕获组(?:表达式)
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性
eg
或者条件
使用分组的同时还可以使用 或者 (or
)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |
符号:
eg
分组的回溯引用
分组的回溯引用 ,使用\N
可以引用编号为N
的分组
eg;下图的 \2 实际就是引用(b)分组,\1 引用 (a)分组
正向先行断言
正向先行断言: (?=表达式)
,表示字符串后面必须满足 =
后面的规则,但并不消费(匹配)输入字符串中的字符;
eg:
eg:匹配密码强弱
^: 匹配字符串的开始位置。 (?=. *[A-Z]): 零宽度正向预查,表示字符串中至少包含一个大写字母。
(?=.* [a-z]): 零宽度正向预查,表示字符串中至少包含一个小写字母。
(?=. *\d): 零宽度正向预查,表示字符串中至少包含一个数字。
.{8,}: 匹配任意字符至少 8 次。
$: 匹配字符串的结束位置。
综合起来,这个正则表达式要求密码中至少包含一个大写字母、一个小写字母、一个数字,并且长度至少为 8 个字符。
反向先行断言
反向先行断言 (?!表达式)
表示要匹配的字符串后面不能满足 ?!
后面的规
匹配不包括 '黑凤黎' 的 '黑凤'字符串
匹配非qq邮箱
^: 匹配字符串的开始位置。 (?!. *@qq.com <math xmlns="http://www.w3.org/1998/Math/MathML"> ) : 零宽度负向预查,表示字符串中不包含以 " @ q q . c o m " 结尾的子串。 . ∗ : 匹配任意字符任意次数。 ): 零宽度负向预查,表示字符串中不包含以 "@qq.com" 结尾的子串。 .*: 匹配任意字符任意次数。 </math>):零宽度负向预查,表示字符串中不包含以"@qq.com"结尾的子串。.∗:匹配任意字符任意次数。: 匹配字符串的结束位置。
正向后行断言
正向后行断言: (?<=表达式)
表示字符串前面必须满足 =
后面的规则,但并不消费(匹配)输入字符串中的字符;
注意:不是所有浏览器都支持
eg 仅仅匹配 '黑凤梨'当中的'凤梨'
反向后行断言
反向后行断言: (?<!表达式)
示字符串前面必须不能满足 <! 前面的规则,但并不消费(匹配)输入字符串中的字符;
注意:不是所有浏览器都支持
eg
终点
如果你常常忘记正则的含义,可以收藏进自己的某个专栏,用上时可以翻阅一下
调试工具regexr 调试工具挺好用的,墙裂推荐
不足之处评论区留言,作者会及时更正!(抱拳