跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

正则表达式中?的作用_正则表达式问号符号的多种功能

?在正则中身兼三职:作量词表“0或1次”,作非贪婪修饰符改匹配策略,作扩展分组起始标记;用错位置会导致匹配失败或语义错误。
?
在 正则表达式 里不是“可有可无”那么简单,它既是量词修饰符,又是模式控制开关,一符多职,用错位置会导致完全不同的匹配行为。 作为量词:表示“前面的元素出现 0 次或 1 次” 这是
?
最基础的用法,紧跟在某个字符、分组或字符类后面,让该部分变成“可选”。注意它只作用于紧邻的前一个单元。
a?
匹配 0 个或 1 个
a
(即不匹配
a
或匹配单个
a
)
(ab)?
匹配 0 次或 1 次整个子串
ab
,不是
a
和
b
各自可选
[0-9]?
匹配 0 个或 1 个数字,不是“任意数字或空”,而是“最多一位数字” 常见误写:
ab?
表示
a
必须存在,
b
可选;而
(ab)?
表示整个
ab
可选。两者语义不同,不能互换。 作为非贪婪修饰符:跟在
*
、
+
、
{n,m}
后面改变匹配策略 默认情况下,
*
和
+
是贪婪的,会尽可能多地匹配;加上
?
后变成非贪婪(懒惰)模式,改为尽可能少地匹配。
a.*b
在
abcb
中匹配整个
abcb
a.*?b
在
abcb
中只匹配第一个
ab
\d+?
对
123
会尝试先匹配
1
,再看是否满足后续条件,而非直接吞掉全部 性能提示:非贪婪匹配可能触发更多回溯,长文本中慎用
.*?
,优先考虑更精确的否定字符类,比如用
[^b]*
替代
.*?
。 Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 作为分组语法的一部分:
(?:...)
、
(?=...)
、
(?!...)
等扩展语法 这里的
?
是“特殊分组”的起始标记,必须紧跟
(
,且后接特定字母(如
:
、
=
、
!
),它本身不表示“可选”,而是开启一种语法模式。
(?:abc)
是非捕获分组,不保存匹配结果到
$1
等变量
(?=pattern)
是正向先行断言,要求当前位置之后能匹配
pattern
,但不消耗字符
(?!pattern)
是负向先行断言,要求之后不能匹配
pattern
易错点:
(?abc)
是非法语法,
?
后必须是合法的扩展标识符;
(?i)
这类内联标志也属于这一类,但作用于整个后续表达式或局部范围。 单独出现或放在错误位置时的行为
?
单独写在正则开头或末尾(如
^?
、
?$
)多数引擎会报错或忽略——它必须依附于某个前置元素才有意义。
?
单独使用:Python 的
re
模块抛
re.error: nothing to repeat
;JavaScript 返回无效正则对象
?+
或
??
这类重复量词:除 PCRE 支持占有性量词(如
++
)外,
?+
通常非法
[?]
:此时
?
在字符类中失去特殊含义,仅表示字面问号字符 调试建议:遇到匹配异常,先检查
?
前面有没有合法的原子(字符、分组、类等),再确认它是否意外开启了扩展语法(比如漏写了
:
导致
(?abc)
被当成断言解析失败)。

相关文章