正则表达式

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式。它是一种强大的文本处理工具,可以用来执行复杂的字符串搜索、替换、验证等操作。

1.组成

正则表达式由普通字符(如字母、数字)和特殊字符(称为元字符)组成。元字符用于定义匹配规则,例如匹配任意字符、重复次数等。

2.常用元字符及语法

元字符:

元字符 含义
. 匹配任意单个字符(除换行符 \n 外)
^ 匹配字符串的开头
$ 匹配字符串的结尾
\d 匹配任意数字(0-9)
\w 匹配任意字母或数字(等价于 [a-zA-Z0-9_]
\s 匹配任意空白字符(空格、制表符、换行符等)
\D 匹配任意非数字字符
\W 匹配任意非字母数字字符
\S 匹配任意非空白字符
[abc] 匹配字符集中的任意一个字符(例如 abc
[a-z] 匹配任意一个小写字母(范围匹配)
[A-Z] 匹配任意一个大写字母
[0-9] 匹配任意一个数字
[^abc] 匹配不在字符集中的任意一个字符
* 匹配前面的字符 零次或多次
+ 匹配前面的字符 一次或多次
? 匹配前面的字符 零次或一次
{n} 匹配前面的字符 恰好 n 次
{n,} 匹配前面的字符 至少 n 次
{n,m} 匹配前面的字符 至少 n 次,但不超过 m 次
() 分组(用于捕获匹配的子串)
| 匹配多个选项中的任意一个
\ 转义字符(用于匹配元字符本身)

语法:
1.捕获组与非捕获组

() 捕获组 :捕获匹配的子字符串,可以通过 $1$2 等在替换中引用。

(?: ) 非捕获组 :在分组中加上 ?:,表示不捕获子字符串。

2.断言(Assertions)

断言用于指定匹配的条件,但不消耗字符(即不移动匹配的"游标")。

(?= ) 零宽正向肯定断言 :匹配某个位置的后面是否符合某个模式。

• 示例:abc(?=def) 匹配 abc,但仅当其后面是 def 时。

• 示例:\d+(?=元) 匹配数字,但仅当其后面是"元"时。

(?! ) 零宽正向否定断言 :匹配某个位置的后面是否不符合某个模式。

• 示例:abc(?!def) 匹配 abc,但仅当其后面不是 def 时。

• 示例:\d+(?!元) 匹配数字,但仅当其后面不是"元"时。

(?<= ) 零宽负向肯定断言 :匹配某个位置的前面是否符合某个模式。

• 示例:(?<=abc)def 匹配 def,但仅当其前面是 abc 时。

• 示例:(?<=\d+)元 匹配"元",但仅当其前面是数字时。

(?<! ) 零宽负向否定断言 :匹配某个位置的前面是否不符合某个模式。

• 示例:(?<!abc)def 匹配 def,但仅当其前面不是 abc 时。

• 示例:(?<!\d+)元 匹配"元",但仅当其前面不是数字时。

3.修饰符(Modifiers)

修饰符用于改变正则表达式的匹配行为。

i不区分大小写

• 示例:/abc/i 匹配 abc、Abc、ABC 等。

g全局匹配 ,匹配所有符合条件的子字符串。

• 示例:/abc/g 匹配字符串中所有 abc。

m多行模式 ,在多行字符串中,匹配每一行的开头和结尾

• 示例:/hello$/m 在多行字符串中,匹配每一行以 hello 结尾的行。

s". "匹配所有字符 ,包括换行符。

• 示例:/hello.world/s 匹配跨行的

hello

world。

3.常见用法

以下是一些常见的正则表达式用法示例:
1.匹配电子邮件地址

电子邮件地址通常包含用户名、@ 符号和域名。正则表达式可以用来匹配这种格式:

py 复制代码
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b

2.匹配电话号码

电话号码的格式可能因国家而异,但常见的格式是:

py 复制代码
\+?\d{1,3}[-.\s]?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

这个正则表达式可以匹配国际电话号码(带或不带 + 号)、带括号的区号等。

3.匹配日期

日期格式可以是 YYYY-MM-DDDD/MM/YYYY 等:

#匹配 YYYY-MM-DD 格式

py 复制代码
\b\d{4}-\d{2}-\d{2}\b

#匹配 DD/MM/YYYY 格式

py 复制代码
\b\d{2}/\d{2}/\d{4}\b

4. 匹配网址

网址通常以 http://https:// 开头,后面跟着域名和路径:

py 复制代码
\bhttps?://[^\s]+

5. 匹配 IP 地址

IPv4 地址由四组数字组成,每组数字范围是 0-255:

py 复制代码
\b(?:\d{1,3}\.){3}\d{1,3}\b

6. 匹配纯数字

匹配任意长度的数字:

py 复制代码
\b\d+\b

7. 匹配单词

匹配任意单词(字母组成):

py 复制代码
\b\w+\b

8. 匹配特定格式的字符串

例如,匹配以 abc开头,以 xyz结尾的字符串:

py 复制代码
^abc.*xyz$

4.注意事项

1. 转义字符: 如果需要匹配元字符本身(如 .*? 等),需要用反斜杠杠\进行转义。例如,要匹配一个点号 .,应写为\.。而在方括号 [] 内,只有 ^(在开头时)、-(在中间时)和 \ 需要特别注意转义。其他字符通常不需要转义。
2. 贪婪模式与非贪婪模式: 默认情况下,正则表达式是贪婪的,会尽可能多地匹配字符。这可能会受到ReDoS攻击。如果需要非贪婪匹配(尽可能少地匹配字符),可以在量词后面加上 ?。例如:

• 贪婪模式: .\* (匹配尽可能多的字符)

• 非贪婪模式: .\*? (匹配尽可能少的字符)
3. 边界匹配:

\b:匹配单词边界。

^: 匹配字符串开头。

$: 匹配字符串结尾。

正则表达式是一种非常强大的工具,可以用于复杂的字符串匹配和处理。掌握基本的元字符和规则后,可以通过组合这些规则来实现各种复杂的匹配需求。

相关推荐
大猫会长1 天前
js中,正则表达式m修饰符说明
正则表达式
明月看潮生1 天前
青少年编程与数学 02-008 Pyhon语言编程基础 24课题、正则表达式
开发语言·python·青少年编程·正则表达式·编程与数学
呀啊~~1 天前
【前端基础】深入解析JavaScript中的编译原理、内存管理、垃圾回收机制和正则表达式
前端·javascript·学习·正则表达式
c无序1 天前
正则表达式的简单介绍 + regex_match使用
正则表达式
真想骂*2 天前
打造iOS电话号码输入验证:正则表达式应用实例
ios·正则表达式·cocoa
编程星空3 天前
正则表达式
正则表达式
陈奕迅本讯5 天前
正则表达式
正则表达式
来恩10036 天前
C# 字符串与正则表达式介绍
数据库·正则表达式·c#
一水鉴天6 天前
为AI聊天工具添加一个知识系统 之75 详细设计之16 正则表达式 之3 正则表达式模板
人工智能·正则表达式