【问题标题】:Regex to extract cents value from arbitrary currency formatting正则表达式从任意货币格式中提取美分值
【发布时间】:2017-03-30 10:49:32
【问题描述】:

我需要使用 Java 正则表达式从下一个可能的值中提取美分值(千位分隔符可以是点和逗号):

$123,456.78 
123,456.78 dollars
123,456.78

我有部分可行的解决方案:

[\.,]\d\d\D

我的解决方案的问题是,当最后一位数字是字符串的结尾时,它在“123,456.78”的情况下不起作用。我该如何处理这种情况?

http://java-regex-tester.appspot.com/regex/6af08221-63cb-4c5b-a865-c86fe5e825ff

【问题讨论】:

  • 所以你想要78 作为输出?
  • \D 设为可选或更好地将您的正则表达式更改为 (?:\d+,)*(?:\d+)\.(\d+),即匹配整个字符串并提取小数点后的数字。
  • 试试[.,](\d{2})(?!\d)
  • Wiktor,它有效,您能否创建一个答案并解释一下?!\d 部分?
  • 你可能还想试试replaceAll(".*\\.(\\d+)\\D*", "$1")

标签: java regex regex-lookarounds


【解决方案1】:

请注意,\D 需要在 ,/. 之后的字符不是数字,并且模式中有 2 个数字。如果您想确保在不消耗(需要)的情况下没有数字,请使用负前瞻:

[.,](\d{2})(?!\d)
           ^^^^^^ 

请参阅regex demo

详情

  • [.,] - 点或逗号(支持不同国家/地区的小数分隔符,而不仅仅是美国)
  • (\d{2}) - 第 1 组(由于 \d{2} 出现在捕获组 (...) 内,您可以使用 Matcher.group(1) 访问其值)
  • (?!\d) - 负前瞻,要求前 2 位数字后面没有数字。

查看更多关于how negative lookahead works的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2011-11-15
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2013-02-02
    • 2010-10-23
    相关资源
    最近更新 更多