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

7vhp5slm  于 5个月前  发布在  Scala
关注(0)|答案(2)|浏览(53)

我在scala中寻找一个正则表达式来匹配几个float:

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.可能给出了千个分隔符(逗号或点)
1.也可能是小数,用逗号或点作为分隔符
目前我被困在

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

编辑:我主要关注欧洲符号。

当前模式不匹配的示例:1,052,161
我猜它将是足够接近的匹配,字符串只包含数字,符号,逗号和点

ctehm74n

ctehm74n1#

如果像你的编辑建议的那样,你愿意接受一个简单的“包含数字、符号、逗号和点”的字符串,那么这个任务是微不足道的。

[+-]?\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"这样的数字不会被评估为有效。

u0sqgete

u0sqgete2#

根据你的规定
它应该匹配一个数字:

  • 可能给出了千个分隔符(逗号或点)
  • 也可能是小数,用逗号或点作为分隔符

Regex:

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

字符串

  • [+-]?开始时允许+-或什么都不允许
  • \d{1,3}允许1到3位数字
  • ([,.]\d{3})允许.,作为千位分隔符,后跟3位数(*允许无限制的匹配)
  • (?:[,.]\d+)?允许.,作为小数分隔符,后面至少有一个数字。

这与OP的所有示例案例相匹配。请查看下面的演示以了解更多信息:
Regex101 Demo
然而,它的一个限制是允许.,作为千位分隔符和小数点分隔符,并且不验证如果,是千位分隔符,那么. * 应该是 * 小数点分隔符。因此,以下情况错误地显示为匹配:

201,350,780,88
211.950.266.4


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

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


Regex101 Demo
希望这对你有帮助!

相关问题