C# 正则表达式无法匹配.h文件中_TARGET_VERSION赋值行问题求助
问题原因
- 核心错误是启用了
RegexOptions.IgnorePatternWhitespace选项:该选项会忽略正则表达式中所有未转义的空白字符,你写在正则里等号两侧的空格会被正则引擎直接丢弃,实际生效的匹配规则是_TARGET_VERSION=\$\(_TARGET_VERSION_GREEN\),和目标文本中等号带空格的格式完全不匹配。 - 次要隐患:普通字符串的多层转义写法容易出错,C#中更推荐用带@前缀的逐字字符串写正则,只需要给正则引擎做一层转义即可,避免转义计数混乱。
修正方案
两种修改方式任选其一即可:
方式1:删除不需要的RegexOptions.IgnorePatternWhitespace选项
该选项一般用于带注释、格式化拆分的长正则场景,你的正则很短完全不需要开启,直接移除即可匹配成功,修正后代码如下:
static void Main(string[] args) { // 也可换成逐字字符串写法更易读:@"(_TARGET_VERSION = \$\(_TARGET_VERSION_GREEN\))" var expr = "(_TARGET_VERSION = \\$\\(_TARGET_VERSION_GREEN\\))"; var repl = "!if 0\n$1\n!endif"; var content = File.ReadAllText("fixme.h"); // 仅保留需要的配置,当前场景没有用^/$匹配行首行尾,Multiline也可以直接去掉 var searchOptions = RegexOptions.Multiline; var matched = Regex.Match(content, expr, searchOptions); if (matched.Success) { var newContent = Regex.Replace(content, expr, repl, searchOptions); File.WriteAllText("fixed.h", newContent); } }
方式2:保留选项则转义正则中的空格
如果你确实需要保留RegexOptions.IgnorePatternWhitespace,就需要把正则中需要匹配的空格转义,或者用\s匹配空白字符,正则修改为:
// 逐字字符串写法,\s兼容空格、制表符等空白字符,+可兼容多空格场景 var expr = @"(_TARGET_VERSION\s+=\s+\$\(_TARGET_VERSION_GREEN\))";
内容的提问来源于stack exchange,提问作者B.McKee
相关产品推荐
相关产品推荐

