Regex IsMatch匹配异常:为何部分目标字符串无法匹配?
问题原因分析
你的正则表达式Process(.+)\\.+在C#中的实际匹配逻辑和预期不符,导致只有前两个字符串匹配成功,具体原因如下:
正则的实际匹配逻辑
在C#字符串中,\\.会被转义为正则里的\.(专门匹配点字符.),所以你的正则模式实际解析为:
Process:匹配开头的固定前缀(.+):贪婪匹配任意1个及以上字符(会尽可能向后匹配)\.+:匹配1个及以上的点字符
前两个字符串匹配成功的原因
前两个字符串的括号内包含多个点字符(比如Bystronic.Ads.GraphQL里的.),正则的贪婪特性会让(.+)一直匹配到字符串中最后一个点的位置,然后\.+匹配这个点及后续的点(如果有),因此整个正则能匹配成功。
后三个字符串匹配失败的原因
- 第三个字符串:虽然括号内有
.,但字符串后半部分(\IO Write Bytes/sec)没有任何点字符,(.+)贪婪匹配到末尾后,无法找到满足\.+的内容,匹配失败。 - 第四、五个字符串:整个字符串中完全没有点字符,
\.+根本找不到匹配项,直接匹配失败。
修正后的正则
如果你想匹配所有Process(...)\\xxx格式的字符串,推荐用C#逐字字符串避免转义混乱,使用更精确的正则:
private static bool IsProcessMatch(string column) { return Regex.IsMatch(column, @"Process\(.+\)\\.+"); }
这个正则的逻辑是:
Process\(:匹配固定开头Process(.+:匹配括号内的任意内容\):匹配闭合括号)\\:匹配反斜杠.+:匹配反斜杠后的任意内容(至少1个字符)
这样就能正确匹配你列出的所有测试字符串了。
内容的提问来源于stack exchange,提问作者Shirkam
相关产品推荐
相关产品推荐

