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