我一直在使用正则表达式来查找字符串中的不同模式,这可以正常工作,但我正在失去发生的顺序。
例如,当我检查这个字符串:this.toHEX.convert(+numbers[0], +numbers[1], +numbers[2]); // using unary +
时,我会检查是否有符号和/或ISO代码,并在侧面做一些额外的工作,最终返回一个数组。但它没有按事件排序
10£ + 5$ / 4EUR
def find_currencies(string)
currencies = []
# check symbols
currencies = currencies + currencies_from_symbol(string) if string =~ /\p{Sc}/
# check iso codes
if Currency.iso_codes.any? { |code| string =~ /#{code}/i }
iso_codes = string.scan(Regexp.new(Currency.iso_codes.join('|'), true))
currencies = currencies + iso_codes.map { |code| Money::Currency.find(code.downcase.to_sym) }
end
currencies
end
def currencies_from_symbol(string)
currencies = Money::Currency.all.select do |m|
string.scan(/\p{Sc}/).include?(m.symbol) && m.priority < 10
end
unless currencies.any? { |m| m.id == :usd || m.id == :gbp }
return currencies
end
# Default to USD and GBP
# TODO: Remove when default can be selected
currencies.select { |m| m.id == :usd || m.id == :gbp }
end
将返回,例如:find_currencies
,它与字符串原始订单不对应。我需要它[#<Money::Currency id: usd>, #<Money::Currency id: gbp>, #<Money::Currency id: eur>]
我真的很感激这方面的帮助。我当前认为我需要同时查找符号和iso代码以某种方式保留发生顺序。但是当然这样做会更好。
答案 0 :(得分:0)
我采用了@kiddorails建议的方法,到目前为止似乎有效。我也拆分了一些方法,但使用所有货币符号并直接select
最终保留了正确的顺序:
symbols = string.scan(/\p{Sc}/)
currencies = symbols.flat_map { |symbol| find_currency_by_symbol(symbol) }
def find_currency_by_symbol(symbol)
Money::Currency.all.select do |currency|
currency.symbol == symbol && currency.priority < 10
end
end