为什么我的正则表达式在某些字符串上失败,否则会成功?
Why is my regex failing on on certain strings that otherwise succeed?
我有用 F# 编写的代码,它使用正则表达式遍历字符串数组以提取部分字符串。问题是正则表达式似乎随机地成功匹配了一些,但在其他人身上却失败了,即使是在之前成功的同一列表中的完全重复项上也是如此。我错过了什么?这是某种我不知道的正则表达式问题吗?
正则表达式模式:
(?i)/(.*?/v\d/.*?((?=\?)|(?=\d)|(?=\n)))
F#代码:
[<Literal>]
let ApiPattern = @"(?i)/(.*?/v\d/.*?((?=\?)|(?=\d)|(?=\n)))"
let parseOutEndpoints (inputs : (int * string) array) =
let regEx = new Regex(ApiPattern, RegexOptions.Compiled)
inputs |> Array.map (fun (id, path) -> [|id.ToString(); path|]) |> Array.collect (fun x -> x)
|> writeRawPathsToFile
File.ReadAllLines(RawPathsFile)
|> Array.map(fun (x) ->
let m = regEx.Match(x)
if m.Success
then
let endpoint = Domain.Endpoint(m.Value)
endpoint
else
let line = $"{x}"
File.AppendAllLines(FailedRegexMatches, [line], Encoding.UTF8)
Domain.NoEndpoint
)
示例字符串数组数据:
所有这些都应该 return 匹配,但不匹配。与这个原始列表相比,成功匹配的列表将 returned 显着减少。
/enterprise-review/v9/choose?rr=Straight&pr=1%2E35239
/review-id-service/v1/business-id
/orderout/v1/vendor/shipping
/vendor-service/v1/Product/PartnerId/35310108
/Inspect/v1/Recommendation/Products/LaneId/0002,519188,13148,16939,7348,195982
/bin-inventory/v1/vendor?el=1%2E35239
/u-future/v1/fone?fhid=3028
/decline-summary/v1/details/card/65821974
/provide-service/v8/proDetails
/monetary-points/v1/sum/wins/681197
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
这是你在 regexstorm 中的正则表达式和输入,一个 .net Rex 测试器:
我本想将其作为评论,但 RS 的分享 urls 包含完整的 Rex 和输入,因此评论太长了(而且评论中不允许 url 缩写词)
所以,我的问题是;这对你来说合适吗?所有突出显示的匹配项都是您期望的匹配项吗?如果是这样,由于 RS 的引擎是基于 .net 的,我认为您的代码的正则表达式部分没有问题..
这个帮助解决了您的问题:
/(.*?/v\d/.*?((?=[\?\d\s])|$))
问题背后的原因:可能是 \r
(windows 回车 return)、空格和字符串结尾(在正则表达式中记为 $
)。
我有用 F# 编写的代码,它使用正则表达式遍历字符串数组以提取部分字符串。问题是正则表达式似乎随机地成功匹配了一些,但在其他人身上却失败了,即使是在之前成功的同一列表中的完全重复项上也是如此。我错过了什么?这是某种我不知道的正则表达式问题吗?
正则表达式模式:
(?i)/(.*?/v\d/.*?((?=\?)|(?=\d)|(?=\n)))
F#代码:
[<Literal>]
let ApiPattern = @"(?i)/(.*?/v\d/.*?((?=\?)|(?=\d)|(?=\n)))"
let parseOutEndpoints (inputs : (int * string) array) =
let regEx = new Regex(ApiPattern, RegexOptions.Compiled)
inputs |> Array.map (fun (id, path) -> [|id.ToString(); path|]) |> Array.collect (fun x -> x)
|> writeRawPathsToFile
File.ReadAllLines(RawPathsFile)
|> Array.map(fun (x) ->
let m = regEx.Match(x)
if m.Success
then
let endpoint = Domain.Endpoint(m.Value)
endpoint
else
let line = $"{x}"
File.AppendAllLines(FailedRegexMatches, [line], Encoding.UTF8)
Domain.NoEndpoint
)
示例字符串数组数据: 所有这些都应该 return 匹配,但不匹配。与这个原始列表相比,成功匹配的列表将 returned 显着减少。
/enterprise-review/v9/choose?rr=Straight&pr=1%2E35239
/review-id-service/v1/business-id
/orderout/v1/vendor/shipping
/vendor-service/v1/Product/PartnerId/35310108
/Inspect/v1/Recommendation/Products/LaneId/0002,519188,13148,16939,7348,195982
/bin-inventory/v1/vendor?el=1%2E35239
/u-future/v1/fone?fhid=3028
/decline-summary/v1/details/card/65821974
/provide-service/v8/proDetails
/monetary-points/v1/sum/wins/681197
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
/listen-service/v1/audio-Details
/comment/v1/data
/comment/v1/data
这是你在 regexstorm 中的正则表达式和输入,一个 .net Rex 测试器:
我本想将其作为评论,但 RS 的分享 urls 包含完整的 Rex 和输入,因此评论太长了(而且评论中不允许 url 缩写词)
所以,我的问题是;这对你来说合适吗?所有突出显示的匹配项都是您期望的匹配项吗?如果是这样,由于 RS 的引擎是基于 .net 的,我认为您的代码的正则表达式部分没有问题..
这个帮助解决了您的问题:
/(.*?/v\d/.*?((?=[\?\d\s])|$))
问题背后的原因:可能是 \r
(windows 回车 return)、空格和字符串结尾(在正则表达式中记为 $
)。