1

我有以下字符串,我需要获取Pizzahut 之间的所有值:| .

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

我有 RegExpression.scan(/(?<=Pizzahut:)([.*\s\S]+)(?=\|)/)但它获取

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

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

4

2 回答 2

2

您可以使用

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仅当模式包含捕获组时才返回捕获,因此您不需要使用环视。

于 2021-07-19T19:10:07.163 回答
1

我不确定您为什么要在这里使用正则表达式解决方案;该输入字符串在我看来显然是结构化的,您可能会通过在分隔符上拆分它以将其转换为更方便的数据结构来做得更好。

像这样的东西:

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!!)

于 2021-07-19T22:38:16.683 回答