用于匹配不同浮点格式的正则表达式

时间:2017-05-29 05:38:46

标签: java regex scala

我正在寻找scala中的正则表达式来匹配几个浮点数:

    9,487,346 -> should match
    9.487.356,453->should match
    38,4 -> match
    -38,4 -> should match
    -38.5
    -9,487,346.76
    -38 -> should match

所以基本上它应匹配一个数字:

  1. 编号列表很简单
  2. 可能有千位分隔符(逗号或点)
  3. 可能是十进制,逗号或点为分隔符
  4. 目前我坚持

        val pattern="\\d+((\\.\\d{3}+)?(,\\d{1,2}+)?|(,\\d{3}+)?(\\.\\d{1,2}+)?)" 
    

    编辑:我大多与欧洲记谱法合作。

    当前模式不匹配的示例:1,052,161

    我想它足够接近,以匹配String只包含数字,符号,逗号和点

2 个答案:

答案 0 :(得分:1)

如果您的编辑建议,您愿意接受一个简单地“包含数字,符号,逗号和点”的字符串,那么该任务就很简单。

[+-]?\d[\d.,]*

<强>更新

经过深思熟虑,并考虑了一些选项,我意识到如果你允许2种不同的RE模式,一种用于美式数字(逗号在点之前)和一种用于欧式数字,我的原始请求是可能的。 (逗号前的点)。

def isValidNum(num: String): Boolean =
  num.matches("[+-]?\\d{1,3}(,\\d{3})*(\\.\\d+)?") ||
    num.matches("[+-]?\\d{1,3}(\\.\\d{3})*(,\\d+)?")

请注意,千位分隔符不是可选的,因此"1234"之类的数字不会被视为有效。可以通过添加更多RE模式来更改:|| num.matches("[+-]?\\d+")

答案 1 :(得分:0)

根据您的规则,

  

它应匹配一个数字:

     
      
  • 编号列表很简单
  •   
  • 可能有千位分隔符(逗号或点)
  •   
  • 可能是十进制,逗号或点为分隔符
  •   

正则表达式:

^[+-]?\d{1,3}(?:[,.]\d{3})*(?:[,.]\d+)?$
  • [+-]?允许+-或一开始就没有任何内容
  • \d{1,3}允许一到三位
  • ([,.]\d{3})允许.,作为千位分隔符后跟3位数字(*允许无限次此类匹配)
  • (?:[,.]\d+)?允许.,作为小数点分隔符,后跟至少一位数字。

这匹配所有OP的示例案例。请查看下面的演示了解更多信息:

Regex101 Demo

然而,一个限制是它允许.,作为千位分隔符和十进制分隔符,并且不验证如果,是千位分隔符然后. 应该是小数分隔符。因此,以下情况错误地显示为匹配:

201,350,780,88
211.950.266.4

为了解决这个问题,以前的正则表达式可以有2个备选方案 - 一个用于检查具有,为千位分隔符和.为十进制的符号,另一个用于检查反之亦然。正则表达式:

^[+-]?\d{1,3}(?:(?:(?:\.\d{3})*(?:\,\d+)?)|(?:(?:\,\d{3})*(?:\.\d+)?))$

Regex101 Demo

希望这有帮助!