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

Java 用于匹配不同浮点格式的正则表达式,java,regex,scala,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 所以基本上它应该匹配一个数字: 编号列表很容易 可能给出了千个分隔符(逗号或点) 可能是以逗号或点作

我正在寻找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
所以基本上它应该匹配一个数字:

  • 编号列表很容易
  • 可能给出了千个分隔符(逗号或点)
  • 可能是以逗号或点作为分隔符的十进制
  • 目前我被困在

        val pattern="\\d+((\\.\\d{3}+)?(,\\d{1,2}+)?|(,\\d{3}+)?(\\.\\d{1,2}+)?)" 
    
    编辑:我最关心的是欧洲符号

    当前模式不匹配的示例:1052161


    我想,如果字符串只包含数字、符号、逗号和点,这将非常接近。如果,正如您的编辑所建议的那样,您愿意接受一个简单地“包含数字、符号、逗号和点”的字符串,那么任务就很简单了

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

    经过仔细考虑,并考虑了一些选项后,我意识到,如果您允许两种不同的重新模式,一种用于美国样式的数字(点之前的逗号)和一种用于欧洲样式的数字(点之前的逗号),您最初的请求是可能的

    请注意,千位分隔符不是可选的,因此像
    “1234”
    这样的数字不会被评估为有效。这可以通过添加更多的重新模式来更改:
    |num.matches(“[+-]?\\d+”)

    基于您的规则

    它应与以下数字匹配:

    • 编号列表很容易
    • 可能给出了千个分隔符(逗号或点)
    • 可能是以逗号或点作为分隔符的十进制
    正则表达式:

    ^[+-]?\d{1,3}(?:[,.]\d{3})*(?:[,.]\d+)?$
    
    • [+-]?
      允许
      +
      -
      或在开始时不执行任何操作
    • \d{1,3}
      允许一到三位数字
    • ([,.]\d{3})
      允许
      作为千位分隔符,后跟3位数字(
      *
      允许无限的此类匹配)
    • (?:[,.]\d+)
      允许将
      作为十进制分隔符,后跟至少一位数字
    这与OP的所有示例案例都匹配。有关更多信息,请查看下面的演示:

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

    201,350,780,88
    211.950.266.4
    
    为了解决这个问题,前面的正则表达式可以有两个替代方法-一个用于检查具有
    作为千位分隔符和
    作为十进制的表示法,另一个用于检查反之亦然的表示法。正则表达式:

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


    希望这有帮助

    你目前的模式有什么问题?什么值不应该匹配?使用这个
    “^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$”
    我认为你对正则表达式的要求太高了。特别是:零个或多个适当间隔的千位分隔符(可能是逗号,也可能是点),以及零或一个分数分隔符(与千位分隔符不同)。将所有这些规则放在一个RE中并不容易。千位分隔符用词不当,因为有些国家每两位数使用一次分隔符。例如,印度使用了一种新方法。此外,有些国家使用空格作为分隔符。您是否故意忽略,例如
    6.02e23
    ^[+-]?\d{1,3}(?:(?:(?:\.\d{3})*(?:\,\d+)?)|(?:(?:\,\d{3})*(?:\.\d+)?))$