将字符串和数字与正则表达式匹配,以从字符串中获取项目和数量

时间:2016-03-29 14:34:45

标签: ruby regex

例如,如果我有一个字符串列表,例如'car 24''house''charlet bundle 54''chroma5one jenkin 4''m8rial imperial 54'。 我想创建一个正则表达式匹配器,这样每个项目都会产生相应的结果:

"car 24" #=> {item: 'car', quantity: 24}
"house" #=> {item: 'house', quantity: nil}
"charlet bundle 54" #=> {item: 'charlet bundle', quantity: 54}
"chroma5one jenkin 4" #=> {item: 'chroma5one jenkin', quantity: 4}
"m8rial imperial 50" #=> {item: 'm8rial imperial', quantity: 50}
"hou58" #=> {item: 'hou58', quantity: nil}

到目前为止,我已经尝试了几种方法,但它们似乎并不完美。例如(?<item>[[a-zA-Z0-9\s]*]+)(?<quantity>\d+)? 似乎有效的方法是:(?<item>[[a-zA-Z0-9\s]*]+)(\D)(?<quantity>[\d]+)?但在每个表达式后总是需要一个空格。任何帮助,将不胜感激。 感谢

2 个答案:

答案 0 :(得分:2)

R = /
    \s+     # match > 0 whitespace characters
    (?=\d)  # match a digit in a positive lookahead
    /x      # free-spacing regex definition mode

def make_hash(str)
  item, quantity = str.split(R)
  { item: item, quantity: quantity }
end

['car 24', 'house', 'charlet bundle 54', 'chroma5one jenkin 4',
 'm8rial imperial 54', 'hou58'].each { |s| puts make_hash(s) }
  # {:item=>"car", :quantity=>"24"}
  # {:item=>"house", :quantity=>nil}
  # {:item=>"charlet bundle", :quantity=>"54"}
  # {:item=>"chroma5one jenkin", :quantity=>"4"}
  # {:item=>"m8rial imperial", :quantity=>"54"}
  # {:item=>"hou58", :quantity=>nil}

答案 1 :(得分:1)

string = 'm8rial imperial 54'   

string.scan(/\A([\w\W]+?)(?:\s+(\d+))?\z/).map { |(i,q)| {:item => i, :quantity => q} }
    #=> [{:item=>"m8rial imperial", :quantity=>"54"}]

这是你要找的吗?

如果在其末尾有一个整数(以字符串格式),它会将您的字符串拆分为两部分。如果没有,那么您的整个字符串都放在itemnilquantity下。