把开关写进模式
内联修饰符是在模式内部书写的开关,写法为圆括号内加问号与修饰字母,例如忽略大小写、多行、点号跨行。它的价值在于让模式自包含:不依赖调用方传参,复制到别的脚本里语义不变。
作用范围要看引擎
多数现代引擎的规则是「从该处生效到所属分组结束」,因此可以借助括号把修饰符限定在局部;历史上部分实现曾有「写在中间却影响整个模式」的行为。跨引擎使用前,先在小样本上确认当前实现的作用范围。
基本信息
| 写法形式 | 圆括号内问号加修饰字母,可连续写多个 |
|---|---|
| 常见修饰 | 忽略大小写、多行锚点、点号跨行、自由间距、按 ASCII 语义解释字符类 |
| 局部作用域 | 写成带作用范围的写法,只对括号内内容生效 |
| 取消修饰 | 在修饰字母前加减号表示关闭某项 |
| 引擎支持 | PCRE、Python、Java、.NET、RE2 支持;JavaScript 长期不支持模式内写法,需用字面量后的标志,新标准开始引入作用域修饰符,可用性以运行时版本为准 |
| 与参数关系 | 调用方参数与内联写法同时存在时,以引擎规定的优先级为准 |
典型使用场景
- 模式需要跨越工具边界复用,用内联写法保证语义不随调用方式改变
- 只让模式中的一小段忽略大小写,其余部分保持严格比对
- 需要点号跨行而锚点仍按整段文本判定,只开单行模式
- 在自由间距模式下书写带注释的长模式
- 排查模式在不同环境表现不一致:先核对内联修饰符是否被支持
内联修饰符的常见写法
内联修饰符的常见写法
(?i)abc # 从此处开始忽略大小写
(?s)start.*end # 点号允许匹配换行
(?m)^key=\w+ # 锚点按行生效
(?x)\d{4} - \d{2} # 自由间距:空白被忽略,便于排版
(?i:abc)def # 只让括号内忽略大小写
(?-i:ABC)def # 括号内关闭忽略大小写,其余保持
(?a)\w+ # 按 ASCII 语义解释字符类简写(部分引擎支持)常见修饰字母含义
| 修饰 | 作用 | 注意事项 |
|---|---|---|
| 忽略大小写 | 字符比较不区分大小写 | 多语言折叠规则存在差异 |
| 多行 | 锚点逐行生效 | 不影响点号 |
| 单行 | 点号匹配换行 | 不影响锚点 |
| 自由间距 | 忽略空白并可写注释 | 类内空白仍保留 |
| ASCII 语义 | 简写类回到半角范围 | 部分引擎不支持该字母 |
内联写法与调用方参数并存时,两边的作用范围可能相互覆盖。团队协作时建议二选一并在代码注释里说明,避免出现「改参数没反应」或「改模式没反应」的困惑。
自由间距模式会忽略模式中的空白,空格要用转义或字符类表示。它同时让模式可以用缩进与注释排版,是维护复杂模式最实用的手段之一。