regex-获取字符串的一部分

epggiuax  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(377)

下面是字符串,我需要得到pizzahut:和|之间的所有值。

ABC:2fg45rdvsg|Pizzahut:j34532jdhgj|Dominos:3424232|Pizzahut:3242237|Wendys:3462783|Pizzahut:67688873rg|

我有一个好的表达 .scan(/(?<=Pizzahut:)([.*\s\S]+)(?=\|)/) 但这很有吸引力

"j34532jdhgj|Dominos:3424232|Pizzahut:3242237|Wendys:3462783|Pizzahut:67688873rg|"

结果应该是: 34532jdhgj,3242237,67688873rg

8yoxcaq7

8yoxcaq71#

你可以用

s='ABC:2fg45rdvsg|Pizzahut:j34532jdhgj|Dominos:3424232|Pizzahut:3242237|Wendys:3462783|Pizzahut:67688873rg|'
p s.scan(/Pizzahut:([^|]+)/).flatten

# => ["j34532jdhgj", "3242237", "67688873rg"]

请参阅此ruby演示和rubular演示。
看来你不可能有 Pizzahut 作为另一个单词的一部分,但也可以使用带有单词边界的版本, /\bPizzahut:([^|]+)/ .
这个 Pizzahut:([^|]+) 比赛 Pizzahut: 然后将管道以外的任何一个或多个字符捕获到组1中(使用 ([^|]+) ).
注意 String#scan 仅当模式包含捕获组时才返回捕获,因此不需要使用lookarounds。

xam8gpfp

xam8gpfp2#

我不知道你为什么要跳到这里的正则表达式解决方案;在我看来,这个输入字符串显然是结构化的,通过在分隔符上拆分它,将其转换为更方便的数据结构,您可能会做得更好。
大概是这样的:

input = "ABC:2fg45rdvsg|Pizzahut:j34532jdhgj|Dominos:3424232|Pizzahut:3242237|Wendys:3462783|Pizzahut:67688873rg"

converted_input = input
  .split('|') #=> ["ABC:2fg45rdvsg", "Pizzahut:j34532jdhgj", ... ]
  .map { |pair| pair.split(':') } #=> [["ABC", "2fg45rdvsg"], ["Pizzahut", "j34532jdhgj"], ... ]
  .group_by(&:first) #=> {"ABC"=>[["ABC", "2fg45rdvsg"]], "Pizzahut"=>[["Pizzahut", "j34532jdhgj"], ... ], "Dominos"=>[["Dominos", "3424232"]], ... ]
  .transform_values { |v| v.flat_map(&:last) }

(上述一系列转换只是一种可能的方式;您可能会想出十几个类似的替代步骤来将此输入转换为如下所示的相同哈希!例如,通过使用 reduce 甚至是 CSV 图书馆。)
这将为您提供最终结果:

converted_input = {
  "ABC" => ["2fg45rdvsg"],
  "Pizzahut" => ["j34532jdhgj", "3242237", "67688873rg"],
  "Dominos" => ["3424232"],
  "Wendys" => ["3462783"]
}

现在数据已方便地格式化,像原始请求一样获取数据变得很简单:

converted_input["Pizzahut"].join(',') #=> "j34532jdhgj,3242237,67688873rg"

(虽然很可能将其作为 Array ,不是逗号分隔的 String !!)

相关问题