Preg_match忽略捕获组分隔符 正则匹配符合规范的会议议程文件名问题
解决方案
核心问题是你没有将可选的bbb议程项编号分组整体标记为可选,且没有严格限定该分组前后的下划线绑定关系。
修正后的正则表达式
/^(\d{4}(?:_?\d{2}){2})_(\w{2,3})(?:_([a-z0-9]{1,3}))?_([a-zA-Z0-9]+)\.pdf$/i
规则说明
- 日期部分
(\d{4}(?:_?\d{2}){2}):兼容yyyymmdd和yyyy_mm_dd两种格式,逻辑和原有规则一致,仅做了写法简化 - 会议类型编码
(\w{2,3}):保留原有2-3位字符的规则 - 可选议程项编号
(?:_([a-z0-9]{1,3}))?:- 外层用
(?: ... )?标记整个分组为可选,不存在时完全跳过匹配 - 必须和前面的下划线绑定,只有存在下划线时才会尝试匹配1-3位的议程项编号,不会误吞后面描述字段的内容
- 内层的
([a-z0-9]{1,3})是捕获组,有议程项编号时会正常捕获,没有时该捕获组返回空值
- 外层用
- 文件描述
([a-zA-Z0-9]+):严格限定仅支持字母数字,符合命名规范要求 - 末尾加
$锚定字符串结尾,避免后缀名后有多余字符也被误匹配
匹配效果验证
对给出的所有示例文件名均可正确分组:
- 无议程项编号的文件(如
20200225_RM_agenda.pdf、2021_02_25_EV_Notice.pdf):第三捕获组(议程项编号)返回空,第四捕获组正确返回完整描述内容 - 有议程项编号的文件:第三捕获组正常返回编号,第四捕获组正确返回描述内容
内容的提问来源于stack exchange,提问作者GDP
相关产品推荐
相关产品推荐

