为什么我的正则表达式对部分符合条件的字符串匹配失败?
问题根因
- 核心问题:文件写入逻辑错误混入无效待匹配内容
你当前代码将输入的(ID,路径)元组转换为[ID字符串, 路径]数组后压平写入文件,最终写入的文件结构为:
第1行:ID1 第2行:路径1 第3行:ID2 第4行:路径2 ...
用File.ReadAllLines读取后所有行都会进入正则匹配逻辑,纯数字的ID行自然无法匹配规则,这就是相同路径有时匹配成功有时失败的直接原因。
- 次要问题:正则规则存在逻辑漏洞
File.ReadAllLines返回的每一行会自动移除末尾换行符,你规则中的(?=\n)断言永远无法触发- 非贪婪匹配
.*?配合后置断言,当路径结尾既不是?也不是数字时,无法完成匹配,比如示例中的/review-id-service/v1/business-id就会命中该问题导致匹配失败
修复方案
- 移除冗余的写文件再读文件流程,直接处理原始输入中的路径字段,避免混入ID
- 修正正则规则,将结束条件改为匹配到
?或行尾即可,适配你的提取需求:
(?i)/.*?/v\d/[^?]*
- 优化后代码参考:
[<Literal>] let ApiPattern = @"(?i)/.*?/v\d/[^?]*" let parseOutEndpoints (inputs : (int * string) array) = let regEx = Regex(ApiPattern, RegexOptions.Compiled) inputs |> Array.map(fun (id, path) -> let m = regEx.Match(path) if m.Success then Domain.Endpoint(m.Value) else File.AppendAllLines(FailedRegexMatches, [path], Encoding.UTF8) Domain.NoEndpoint )
内容的提问来源于stack exchange,提问作者user1206480
相关产品推荐
相关产品推荐

