正则表达式在线测试网站:regex101: build, test, and debug regex
该网站可以测试自己写的正则表达式能否正确匹配文本内容
一、常用元字符及含义
(注:在正则表达式中,".*
"的作用是匹配任意字符(除了换行符 \n
)零次或多次。因此,.*
可以匹配任意长度的字符串,包括空字符串,因为*允许零次匹配,如下图匹配到空字符串,但是使用".+"时可以匹配到整个字符串,而不会匹配到空字符串
在使用 .*
时,通常需要结合其他模式和限定符,以便精确地匹配需要的文本。)
元字符 | 描述 | 正则表达式 | 示例 |
---|---|---|---|
. | 匹配任意字符(除了换行符 \n ) | a.b | aab , axb , a1b , 但不匹配 ab,可以理解为一个占位符 |
^ | 匹配字符串的开始 | ^abc | abcxyz , abc123 |
$ | 匹配字符串的结束 | xyz$ | 123xyz , abcxyz |
* | 匹配前一个字符零次或多次 | a*b | b , ab , aaab , aaaab |
+ | 匹配前一个字符一次或多次 | a+b | ab , aab , aaab , aaaab |
? | 匹配前一个字符零次或一次 | a?b | b , ab |
{} | 指定匹配次数范围 | a{2,4} | aa , aaa , aaaa ,但不匹配 a 或 aaaaa |
[] | 匹配括号内的任意一个字符 | [aeiou] | \ |
[^] | 匹配不在括号内的任意一个字符 | [^aeiou] | \ |
| | 或 | a|b | a , b |
\b | 匹配单词边界 | \bword\b | word (独立的单词,不匹配 wordpress 或 wording ) |
() | 分组 | (abc)+ | abc , abcabc , abcabcabc |
\ | 转义字符,使下一个字符失去特殊意义 | \. | 匹配. 字符 |
{n} | 匹配前一个字符恰好 n 次 | \d{3} | 123 , 456 , 789 (恰好三个数字) |
{n,} | 匹配前一个字符至少 n 次 | [a-zA-Z]{2,} | Hello , RegexPattern , ABCD( 至少两个字母) |
{n,m} | 匹配前一个字符至少 n 次但不超过 m 次 | \d{2,4} | 12 , 123 , 1234 , 5678 (两到四位数字) |
12.15.23.234
/^[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}$/
而不是
/^[0-9]{2|3}\.[0-9]{2|3}\.[0-9]{2|3}\.[0-9]{3}$/
{2|3} 这种写法在正则表达式中是不合法的
二、转义字符
转义字符 | 含义 |
---|---|
\d | 匹配任意数字字符(0-9) |
\D | 匹配任意非数字字符 |
\w | 匹配任意字母、数字、下划线 |
\W | 匹配任意非字母、数字、下划线 |
\s | 匹配任意空白字符(空格、制表符、换行符等) |
\S | 匹配任意非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
三、括号()
括号 ()
在正则表达式中的作用是分组和捕获。
-
分组(Grouping): 括号允许将多个表达式组合成一个单元,以便对整个单元应用限定符或其他操作符。这使得可以对一个特定的子模式进行操作,而不是整个正则表达式。
示例: 考虑一个正则表达式
(ab)+\d{3}
,它匹配一个或多个连续的 "ab" 字符串后面跟着三个数字。在这个正则表达式中,(ab)+
是一个分组,表示匹配一个或多个连续的 "ab" 字符串。匹配的字符串示例:
abab123
,ababab789
,abababab456
. -
捕获(Capturing): 括号还可以用于捕获匹配的文本,以便在后续操作中使用。当括号包围一个子模式时,匹配的文本会被捕获并存储在一个变量中,供后续的处理使用。
示例: 考虑正则表达式
(\d{3})-(\d{2})-(\d{4})
,例如,123-45-6789
)。在这个正则表达式中,(\d{3})
、(\d{2})
和(\d{4})
是捕获组,分别用于捕获电话号码的区号、前缀和行号。匹配的字符串示例:
123-45-6789
,555-12-3456
,987-65-4321
.
四、懒惰限定符
懒惰限定符(也称为非贪婪限定符)用于使正则表达式匹配尽可能少的字符。在默认情况下,正则表达式是贪婪的,它会尽量匹配更多的字符。懒惰限定符可以通过在限定符后面加上问号 ?
来实现,例如 *?
、+?
、{n,}?
等。
懒惰限定符与贪婪限定符的区别在于,懒惰限定符会尽量少地匹配字符,而贪婪限定符会尽量多地匹配字符。这在处理需要匹配最短字符串的情况下非常有用。
考虑字符串 "abracadabra"
和正则表达式 a.*?a
:
a
匹配第一个字符'a'
。.*?
匹配任意数量的字符,尽可能少地匹配,直到下一个'a'
出现。- 最后一个
a
匹配字符串中的最后一个'a'
。
在贪婪匹配模式下,正则表达式 a.*a
会匹配整个字符串 "abracadabra"
,因为它会尽可能多地匹配字符。但在懒惰匹配模式下,正则表达式 a.*?a
会尽可能少地匹配字符,它会匹配最短的符合条件的子串。
在这个例子中,正则表达式 a.*?a
匹配的结果是 "abra"
,而不是整个字符串 "abracadabra"
。这是因为 .*?
尽可能少地匹配字符,直到找到满足条件的下一个 'a'
为止。