货币iso代码和符号的正则表达式

时间:2017-12-07 19:40:08

标签: ruby regex

我正在尝试找到与货币iso代码或符号完全匹配的货币。我有一个货币和符号列表,在正则表达式中我只使用(USD|JPY)$|£|等。所以标准是:

  1. 应与货币代码USD JPY或符号$ £完全匹配。货币代码不区分大小写
  2. 之前和之后可以有一个可选的号码
  3. 货币之前和之后只能有一个数字(中间可以包含空格)。
  4. 实施例: a = 4USD - $3 + a4 USD / JPY 400 * 3USDa

    输出将是(在ruby中调用.scan):["USD", "$", "USD", "JPY"]

    不正确的是包含3USDa

    我一直在尝试很多模式无济于事,其中有些模式:

    /\d+(?=(USD|JPY)(?!\w))|(USD|JPY)(?=\d+(?!\w))/i

    /(?<=(JPY|USD))*\d|(?<=\d)(JPY|USD)/i

1 个答案:

答案 0 :(得分:1)

如果您使用捕获组而不是整体匹配,那么以下可能是满足您要求的最简单的正则表达式解决方案:

/(?<!\w)\d*\s*(JPY|USD|\$|£)\s*\d*(?!\w)/i

Demo

如果您有所有货币的列表,您可以通过编程方式构建该正则表达式:

currencies = %w(USD JPN $ £)
currencies_pattern = currencies.map {|c| Regexp.escape(c) }.join("|")
full_pattern = /(?<!\w)\d*\s*(#{currencies_pattern})\s*\d*(?!\w)/i

如上所述,并非 返回$作为您示例中的有效匹配。根据我对您的规则的理解,我不明白为什么$应被视为不匹配。