正则负向前瞻如何排除短划线开头短行但保留长于35字符的对应行
你的修改存在的问题
你调整后的负向先行断言逻辑完全和需求相悖:(?!.*(?:-\h.{0,35}))的规则是只要行内任意位置出现-加水平空白、且后面跟着0到35个字符,就直接排除该行。所有以- 开头的行,不管总长度多少,开头的- 后必然存在0-35个字符的片段,所以这个断言会把所有短划线开头的行全部过滤掉,自然达不到你要保留长的短划线开头行的要求。
正确正则及逻辑
^(?!^-.{0,33}$)(?=.{35}).{0,35}[\h.]
各部分逻辑说明:
^匹配行首位置(?!^-.{0,33}$)负向先行断言,仅排除**以短划线开头且整行长度≤34(即不足35)**的行,其余所有行都放行(?=.{35})正向前瞻,确保当前行总长度至少为35,符合你要匹配前35个字符内内容的前提.{0,35}[\h.]保持你原来的匹配逻辑:从行首开始匹配最多35个字符,且匹配内容的末尾为水平空白符或点号。
示例测试效果
对你给出的三行示例文本匹配结果如下:
- 普通长文本行:匹配成功,符合预期
- 短划线开头的长文本行:总长度超过35,不会被排除,匹配成功,符合预期
- 短划线开头的短文本行:长度不足35,被排除,符合预期
内容的提问来源于stack exchange,提问作者Ex.
相关产品推荐
相关产品推荐

