我用f#编写了代码,使用正则表达式迭代字符串数组以提取这些字符串的一部分。问题是,regex似乎随机地成功匹配了某些元素,但在其他元素上却失败了,即使是在之前成功匹配的相同列表的精确副本上。我错过了什么?这是我不知道的某种正则表达式问题吗?
正则表达式模式:
(?i)/(.*?/vd/.*?((?=?)|(?=d)|(?=n)))
f#代码:
[<Literal>]
let ApiPattern = @"(?i)/(.*?/vd/.*?((?=?)|(?=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
)
示例字符串数组数据:所有这些都应该返回一个匹配,但是没有。与原始列表相比,返回的成功匹配列表将大大减少。
/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
这个帮你解决了问题:
/(.*?/vd/.*?((?=[?ds])|$))
问题背后的原因:可能是r
(windows回车),空格和字符串结束(在regex中标记为$
)。
这是你在regexstorm中的正则表达式和输入:
regex风暴
我本来想做一个评论,但是RS的共享url包含完整的Rex和输入,所以对于评论来说太长了(所以不允许在评论中缩短url)
我的问题是;你觉得这样对吗?所有高亮显示的匹配都是您期望匹配的吗?如果是这样,由于RS的引擎是基于。net的,我不认为你的代码中的正则表达式部分有问题。