在正则表达式中,?
有多种作用,具体取决于它在正则表达式中的位置和上下文。以下是几种常见的用法:
1. 量词修饰符:表示零次或一次
X?
:表示前面的元素X
可以出现零次或一次(即可选项)。- 示例:
colou?r
可以匹配color
或colour
,因为u
是可选的。
2. 非贪婪匹配
X+?
、X*?
、X{n,m}?
:使量词变成非贪婪模式,匹配尽可能少的字符。- 示例:
".+?"
在字符串"abc"
中会匹配"a"
,而不是"abc"
,因为+?
尽量匹配最少的字符。
3. 前瞻和后顾断言
- 正向前瞻断言
(?=...)
:要求后面必须跟着特定的模式,但不消耗字符。 - 负向前瞻断言
(?!...)
:要求后面不能跟着特定的模式。 - 正向后顾断言
(?<=...)
:要求前面必须有特定的模式。 - 负向后顾断言
(?<!...)
:要求前面不能有特定的模式。
4. 命名捕获组和非捕获组
- 命名捕获组
(?<name>...)
:?
后面跟着<name>
,表示定义一个命名捕获组。 - 非捕获组
(?:...)
:?
后面跟着:
,表示这个组不会被捕获,仅用于分组操作。
例如:
(?<key>...)
:这里的?
是命名捕获组语法的一部分。它表明接下来的部分定义了一个命名捕获组,<key>
是组的名称,...
是要匹配的模式可以是.+等任意匹配模式。
在这种情况下,?
的作用是启动一种特殊的分组方式(命名捕获组),使得你可以通过名称 key
来引用这个组的匹配内容。