为什么我的正则表达式在某些字符串上失败,否则会成功?

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 测试器:

regex storm

我本想将其作为评论,但 RS 的分享 urls 包含完整的 Rex 和输入,因此评论太长了(而且评论中不允许 url 缩写词)

所以,我的问题是;这对你来说合适吗?所有突出显示的匹配项都是您期望的匹配项吗?如果是这样,由于 RS 的引擎是基于 .net 的,我认为您的代码的正则表达式部分没有问题..

这个帮助解决了您的问题:

/(.*?/v\d/.*?((?=[\?\d\s])|$))

问题背后的原因:可能是 \r(windows 回车 return)、空格和字符串结尾(在正则表达式中记为 $)。