例如,如果我有一个字符串列表,例如'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]+)?
但在每个表达式后总是需要一个空格。任何帮助,将不胜感激。
感谢
答案 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"}]
这是你要找的吗?
如果在其末尾有一个整数(以字符串格式),它会将您的字符串拆分为两部分。如果没有,那么您的整个字符串都放在item
和nil
下quantity
下。