正则表达式匹配特定字符串:修正匹配全量的正则模式
修正后的正则表达式方案
问题分析
你原正则的核心问题是正向否定预查的位置错误,(?!HSAC|VOG)仅检查当前位置后是否不是这两个字符串,但.*会匹配任意内容到行尾,导致预查失去排除作用。结合你给出的匹配/不匹配规则,实际需要排除两类记录:
O/后仅为VOG或HSAC(无+的情况)O/后为VOG+HSAC或HSAC+HSAC(有+且最终后缀为HSAC的情况)
修正后的正则
/^PF\s*(?:XAP|FNI)?\s*O\/\s*(?!(?:VOG|HSAC)(?:\s*\+\s*HSAC)?$).*$/gm
正则解释
^:匹配行起始位置,确保从记录开头匹配PF\s*(?:XAP|FNI)?\s*O\/:匹配前缀部分,支持PF后带可选的XAP/FNI(中间可穿插任意空格),以及O/前后的空格\s*:匹配O/后的任意空格(?!(?:VOG|HSAC)(?:\s*\+\s*HSAC)?$):核心排除逻辑的正向否定预查,直接排除两种不符合要求的记录:- 行尾是
VOG或HSAC(无+的无效记录) - 行尾是
VOG+HSAC或HSAC+HSAC(有+且最终后缀为HSAC的无效记录)
- 行尾是
.*:匹配剩余的任意有效内容$:匹配行结束位置gm:全局多行模式,适配多记录的行匹配场景
验证结果
所有你列出的应匹配记录都会被正确命中,所有不应匹配记录都会被排除。
内容的提问来源于stack exchange,提问作者Mitchel Araw
相关产品推荐
相关产品推荐

