正则表达式使用指南
常用匹配符
匹配特定字符
regexp
[格式]
<字符>
[示例]
a(?#匹配字符a)
b(?#匹配字符b)
c(?#匹配字符c)
匹配单个任意字符
regexp
.
匹配特定字符串
regexp
[格式]
<字符串>
[示例]
abc(?#匹配字符串abc)
匹配单个大写字母
regexp
[A-Z]
匹配单个小写字母
regexp
[a-z]
匹配单个数字
regexp
[0-9]
\d
匹配单个空白符
regexp
\s
匹配单个非空白符
regexp
\S
匹配单个大小写字母和数字
regexp
\w
[0-9]|[a-z]|[A-Z]
匹配单个枚举字符
regexp
[cxk](?#匹配单个字符,该字符必须是中括号中含有的字符)
匹配行开头的正则表达式
regexp
[格式]
^<表达式>
[示例]
^abc(?#匹配行开头的abc字符串)
匹配行结尾的正则表达式
regexp
[格式]
<表达式>$
[示例]
[0-9]$(?#匹配以行结尾的数字)
匹配零到多个任意字符
regexp
[格式]
<字符>*
[示例]
a*(?#匹配零到多个字符a)
匹配一到多个任意字符
regexp
[格式]
<字符>+
[示例]
a+(?#匹配一到多个字符a)
匹配零到多个任意表达式
regexp
[格式]
(<表达式>)*(?#当要以一个表达式为整体时,需要用小括号括起来)
[示例]
([0-9]|[a-z])*(?#匹配数字或小写字母零到多个)
匹配一到多个任意表达式
regexp
[格式]
(<表达式>)+(?#当要以一个表达式为整体时,需要用小括号括起来)
[示例]
([0-9]|[a-z])+(?#匹配数字或小写字母零到多个)
匹配特殊含义字符
regexp
[格式]
\<特殊含义字符>(?#当要以一个表达式为整体时,需要用小括号括起来)
[示例]
(?#匹配特殊含义字符.)
\.
[.]
(?#匹配特殊含义字符*)
\*
[*]
(?#匹配特殊含义字符\)
\\
[\\]
特殊含义字符
^
匹配开头位置。
$
匹配结尾位置。
()
标记一个表达式的开始和结束位置。即把一个表达式看作一个整体。
+
匹配前面的子表达式一次或多次。
*
匹配前面的子表达式零次或多次。
[]
用于枚举字符。
|
或运算。用于连接多个表达式。
提问: 为什么正则表达式中没有与逻辑?
答: 在正则表达式中,没有直接的与运算符是因为正则表达式的匹配逻辑已经隐含了与运算的概念。例如:
如果你有两个正则表达式 A 和 B:
A: [0-9]+(匹配一个或多个数字)
B: \w+(匹配一个或多个小写字母
既要满足A又要满足B,那就可以将其化简为一个表达式,[0-9]+
{}
用于指定匹配次数。
regexp
[格式]
<表达式>{<最小值min>,<最大值max>}(?#匹配一个表达式最少min次,最多max次)
<表达式>{<最小值min>,}(?#匹配一个表达式最少min次,最多无数次)
<表达式>{<num>}(?#匹配一个表达式最少num次,最多num次)
[示例]}(?#示例字符串123abc456ed f789 111 aaaa)
a{1,3}
a1,3}
a{1}
\
可以把特殊字符变成普通字符。
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
.
匹配除换行符 \n 之外的任何单字符。
\b
匹配一个单词边界,即字与空格间的位置。
\B
非单词边界匹配。
\cx
匹配由x指明的控制字符。
\f
匹配一个换页符。
\n
匹配一个换行符。
\r
匹配一个回车符。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \cI。
\v
匹配一个垂直制表符。等价于 \x0b 和 \cK。
非贪婪限定符
非贪婪限定符(Non-greedy Quantifiers)是正则表达式中的一种特殊语法,用于控制匹配的方式。它们允许在匹配时尽可能少地获取字符,以避免贪婪匹配。
在正则表达式中,通常使用 *
、+
、?
和 {}
等限定符来指定匹配的次数。默认情况下,这些限定符是贪婪的,即它们会尽可能多地匹配字符。
例如,考虑以下正则表达式:
.*
:匹配任意数量的任意字符。
如果应用这个正则表达式到字符串 "Hello World" 上,它将匹配整个字符串,因为 .*
是贪婪的,会尽可能多地匹配字符。
为了避免贪婪匹配,可以在限定符后面添加一个问号 ?
,将其转换为非贪婪限定符。
以下是常见的非贪婪限定符:
*?
:匹配前面的表达式零次或多次,尽可能少地匹配字符。+?
:匹配前面的表达式一次或多次,尽可能少地匹配字符。??
:匹配前面的表达式零次或一次,尽可能少地匹配字符。{n,m}?
:匹配前面的表达式至少 n 次、最多 m 次,尽可能少地匹配字符。
例如,使用非贪婪限定符的正则表达式 .*?
将只匹配尽可能少的字符,直到遇到下一个匹配项或字符串的结尾。
非贪婪限定符在处理需要精确匹配的情况下特别有用,以避免匹配过多的字符。
希望这个解答对你有所帮助!如果你还有其他问题,请随时提问。
练习题
匹配一个两位数的数字
测试用例
- 用例: 09 结果: 不匹配
- 用例: 19 结果: 匹配
- 用例: 10 结果: 匹配
- 用例: 99 结果: 匹配
- 用例: 199 结果: 不匹配
答案
regexp
^([1-9][0-9]?)$
^([1-9][0-9]{0,1})$
匹配一个三位数的数字
测试用例
- 用例: 09 结果: 不匹配
- 用例: 19 结果: 不匹配
- 用例: 10 结果: 不匹配
- 用例: 99 结果: 不匹配
- 用例: 199 结果: 匹配
- 用例: 099 结果: 不匹配
- 用例: 666 结果: 匹配
- 用例: 1234 结果: 不匹配
答案
regexp
^([1-9][0-9]{2})$