修复匹配INF文件注释的.NET正则表达式:方括号配对错误
修正INF文件注释匹配的.NET正则表达式
INF文件注释核心规则
- 注释以分号
;开头,延续至该行末尾 - 双引号包裹的字符串内的分号,不会触发注释
- 方括号
[]包裹区块内的分号,不会触发注释;分号前若有未闭合的左括号,也不会触发注释 - 仅双引号字符串内允许出现未闭合或嵌套的方括号
原正则的问题
你之前的正则把左方括号和双引号错误配对,导致本该被忽略的字符串/方括号内的分号被误判为注释起始,比如测试输入里第一个分号就被错误匹配了。
修正后的正则表达式
(?:^|(?<=\n))(?:(?:[^;"\[\n]|"(?:[^"\\]|\\.)*"|\[(?:[^\]\n]|\[(?:[^\]\n]*\])?)*\])*);.*?(?:\n|$)
正则逻辑说明
(?:^|(?<=\n)):定位到行的起始位置(包括换行后的新行开头)(?:(?:[^;"\[\n]|"(?:[^"\\]|\\.)*"|\[(?:[^\]\n]|\[(?:[^\]\n]*\])?)*\])*:循环匹配所有不会触发注释的内容,分三个独立分支处理:[^;"\[\n]:匹配普通字符(排除分号、引号、括号、换行)"((?:[^"\\]|\\.)*)":匹配双引号字符串,支持转义双引号(比如\"),确保字符串内的所有内容都被跳过\[(?:[^\]\n]|\[(?:[^\]\n]*\])?)*\]:匹配方括号包裹的区块,支持嵌套方括号,确保括号内的分号不会被误判
;.*?(?:\n|$):匹配真正的注释部分,从第一个不在字符串/方括号内的分号开始,到行尾或换行结束
用你的测试输入验证:A semicolon [inside";] square brackets" does not initiate a comment; but outside - it does.,修正后的正则会正确跳过字符串和方括号内的分号,仅匹配第二个分号开头的; but outside - it does.部分。
内容的提问来源于stack exchange,提问作者Pavel Stepanek
相关产品推荐
相关产品推荐

