查找字符串中的出现并保留出现的顺序

时间:2017-09-16 15:50:09

标签: ruby regex string

我一直在使用正则表达式来查找字符串中的不同模式,这可以正常工作,但我正在失去发生的顺序。

例如,当我检查这个字符串: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代码以某种方式保留发生顺序。但是当然这样做会更好。

1 个答案:

答案 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