Appearance
正则表达式(Regular Expression,简称正则或Regex)是一种用于字符串模式匹配的工具,能够帮助我们高效地搜索、替换、提取和验证文本。正则表达式的规则包括字符匹配、元字符、量词、位置锚定和分组等内容。以下是正则表达式的详细规则:
1. 字符匹配
- 普通字符:普通字符会按字面意义匹配。例如,
a匹配字符串中的字符a。 - 转义字符:一些特殊字符如
.、*、+需要通过反斜杠\转义,如\.匹配的是字符.而不是通配符。
2. 元字符
元字符是正则表达式中特殊的字符,用来表达特殊的含义。
.:匹配任意单个字符(除了换行符)。- 例:
a.c可以匹配abc、a1c等。
- 例:
\d:匹配任何一个数字,等价于[0-9]。- 例:
\d{3}可以匹配三位数字如123。
- 例:
\w:匹配任何字母、数字或下划线,等价于[A-Za-z0-9_]。- 例:
\w+可以匹配一个或多个字母、数字或下划线。
- 例:
\s:匹配任何空白字符(包括空格、制表符、换行符)。- 例:
\s*匹配零个或多个空白字符。
- 例:
\b:匹配单词边界。[ ]:匹配方括号中的任意一个字符。- 例:
[abc]匹配a、b或c。
- 例:
[^ ]:匹配不在方括号中的任意字符。- 例:
[^abc]匹配不是a、b或c的任何字符。
- 例:
- \d
- 含义:匹配一个数字,等价于
[0 - 9]。 - 示例:正则表达式
\d可以匹配字符串 “123abc” 中的 “1”、“2”、“3”。如果要匹配多个数字,可以使用\d+,比如在 “abc123def” 中,\d+会匹配 “123”。
- 含义:匹配一个数字,等价于
- \D
- 含义:匹配一个非数字字符,等价于
[^0 - 9]。 - 示例:在字符串 “abc123def” 中,
\D可以匹配 “a”、“b”、“c”、“d”、“e”、“f”,\D+则会匹配 “abc” 和 “def”。
- 含义:匹配一个非数字字符,等价于
- \S
- 含义:匹配一个非空白字符(空白字符包括空格、制表符、换行符等)。
- 示例:在字符串 “abc def” 中,
\S可以匹配 “a”、“b”、“c”、“d”、“e”、“f”,\S+会匹配 “abc” 和 “def”。
- \s
- 含义:匹配一个空白字符,包括空格、制表符(\t)、换行符(\n)等。
- 示例:在文本 “Hello\tWorld\n” 中,
\s可以匹配 “\t” 和 “\n”,\s+会匹配 “\t”(一个制表符)和 “\n”(一个换行符)。如果要匹配多个连续的空白字符,例如在一段有多个空格的文本中,\s+就很有用。
- \w
- 含义:匹配一个单词字符,包括字母、数字和下划线,等价于
[a - zA - Z0 - 9_]。 - 示例:在字符串 “abc_123” 中,
\w可以匹配 “a”、“b”、“c”、“_”、“1”、“2”、“3”,\w+会匹配 “abc_123”。
- 含义:匹配一个单词字符,包括字母、数字和下划线,等价于
- \W
- 含义:匹配一个非单词字符,等价于
[^a - zA - Z0 - 9_]。 - 示例:在字符串 “abc@123” 中,
\W可以匹配 “@”,\W+会匹配 “@”。这在处理包含特殊符号的文本,需要将非单词字符分离出来时很有用。
- 含义:匹配一个非单词字符,等价于
小写与大写互补,[\d\D]等效于.
[abc]:匹配由a或b或c组成的单个字符a|b|c:匹配由a或b或c组成的单个字符
3. 量词
量词用于指定一个字符或一组字符应该出现的次数。
\*:匹配前面的字符零次或多次。- 例:
ab*匹配a、ab、abb等。
- 例:
+:匹配前面的字符一次或多次。- 例:
ab+匹配ab、abb等,但不匹配a。
- 例:
?:匹配前面的字符零次或一次。- 例:
ab?匹配a或ab。
- 例:
{n}:匹配前面的字符恰好 n 次。- 例:
\d{3}匹配三个数字。
- 例:
{n,}:匹配前面的字符至少 n 次。- 例:
\d{2,}匹配至少两位数字。
- 例:
{n,m}:匹配前面的字符至少 n 次,但不超过 m 次。- 例:
\d{2,5}匹配 2 到 5 位数字。
- 例:
4. 位置锚定
锚定符用于指定模式应该出现的位置。
^:匹配字符串的开头。- 例:
^abc匹配以abc开头的字符串。
- 例:
$:匹配字符串的结尾。- 例:
abc$匹配以abc结尾的字符串。
- 例:
\b:匹配单词的边界。- 例:
\bword\b只匹配单独的word,而不匹配sword或wording。
- 例:
5. 分组与捕获
分组允许我们将正则表达式的一部分视为一个整体,并捕获匹配的子字符串。
( ):用于分组和捕获。- 例:
(abc)+匹配abc或abcabc。
- 例:
(?: ):非捕获组,不会保存匹配的子字符串。- 例:
(?:abc)+匹配abc或abcabc,但不会捕获。
- 例:
\n:捕获组的反向引用,n是一个数字,表示捕获的第n组。- 例:
(\d)\1匹配两个相同的数字。
- 例:
6. 其他特殊字符
|:逻辑或,表示左右两个表达式的任意一个。- 例:
abc|xyz匹配abc或xyz。
- 例:
\:转义字符,用于匹配元字符本身。- 例:
\.匹配字符.。
- 例:
7. 修饰符
(?i):忽略大小写(case-insensitive)(?m):多行模式(multiline)(?s):单行模式(dotall,使.匹配换行符)在正则表达式中,
(?msi)这样的特殊标识被称为 正则表达式的模式修饰符(Pattern Modifiers) 或 正则标志(Regex Flags)。它们用于控制正则表达式的匹配行为,通常出现在正则表达式的开头(或某些语言中通过其他方式指定)。不同的编程语言或正则引擎对这些修饰符的支持可能略有不同,但常见的修饰符包括:
(1)
(?i):忽略大小写(case-insensitive) - 使正则表达式不区分大小写匹配。
(2)
(?m):多行模式(multiline) - 使
^和$匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾。
(3)
(?s):单行模式(dotall) - 使
.匹配包括换行符在内的所有字符(默认.不匹配换行符)。
8. 懒惰模式与贪婪模式
正则表达式默认是贪婪匹配(尽可能多地匹配),而懒惰模式是尽可能少地匹配。
贪婪匹配:默认模式,量词
*、+等是贪婪的,尽可能多地匹配字符。懒惰匹配:在量词后面加 ?
可以使其变为懒惰模式。
- 例:
ab*?将匹配尽可能少的b,而不是尽可能多。
- 例:
9. ?用于“分组控制”
校验后面内容,但是不匹配后面内容
| 写法 | 本质 |
|---|---|
(?:...) | 分组但不记录 |
(?=...) | 后面必须是 |
(?!...) | 后面不能是 |
(?<=...) | 前面必须是 |
(?<!...) | 前面不能是 |
示例
- 所有汉字:
[一-龥]\p - 匹配邮箱地址:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} - 匹配手机号:
1[3-9]\d{9} - 匹配日期:
\d{4}-\d{2}-\d{2}(匹配格式如 2023-09-01)