Regex解析国际浮点数

Regex解析国际浮点数,regex,internationalization,Regex,Internationalization,我需要一个正则表达式来获取可以 111.111,11 111,111.11 111,111 将整数和小数部分分开,这样我就可以用正确的语法存储在数据库中 我尝试了([0-9]{1,3}[,.]?)+([,.][0-9]{2}),但没有成功,因为它没有检测到第二部分:( 结果应该如下所示: 111.111,11 -> $1 = 111111; $2 = 11 怎么样 /(\d{1,3}(?:,\d{3})*)(\.\d{2})?/ 如果您想验证逗号是否每3位正好分开, 或 如果你不

我需要一个正则表达式来获取可以

111.111,11

111,111.11

111,111
将整数和小数部分分开,这样我就可以用正确的语法存储在数据库中

我尝试了
([0-9]{1,3}[,.]?)+([,.][0-9]{2})
,但没有成功,因为它没有检测到第二部分:(

结果应该如下所示:

111.111,11 -> $1 = 111111; $2 = 11
怎么样

/(\d{1,3}(?:,\d{3})*)(\.\d{2})?/
如果您想验证逗号是否每3位正好分开, 或


如果你不这样做。

如果我正确地解释了你的问题,你说的结果应该和你说的“将会”一样,那么我认为你只需要在字符类中保留逗号,因为它被用作分隔符,而不是要匹配的部分

所以先去掉“.”,然后匹配这两个部分

$value = "111,111.11";
$value =~ s/\.//g;
$value =~ m/(\d+)(?:,(\d+))?/;
$1=删除句点的前导整数
$2=如果不存在,则为未定义;如果存在,则为逗号后的数字。

首先,我将使用此正则表达式确定是使用逗号还是点作为逗号分隔符(它获取两个数字中的最后一个):

然后,我会去除所有其他符号(前一个符号不匹配)。如果没有匹配项,则您已经有一个整数,可以跳过下一步。使用正则表达式可以轻松删除所选符号,但还有许多其他函数可以更快/更好地完成此操作

然后留下一个整数形式的数字,后面可能是逗号或点,然后是小数,其中整数和小数部分可以很容易地用下面的正则表达式相互分离

([0-9]+)[,\.]?([0-9]*)
祝你好运

编辑:

这里是一个用python制作的示例,我假设代码应该是自我解释的,如果不是,请询问

import re

input = str(raw_input())
delimiterRegex = re.compile('[0-9,\.]*([,\.])[0-9]*')
splitRegex = re.compile('([0-9]+)[,\.]?([0-9]*)')

delimiter = re.findall(delimiterRegex, input)

if (delimiter[0] == ','):
    input = re.sub('[\.]*','', input)
elif (delimiter[0] == '.'):
    input = re.sub('[,]*','', input)

print input
使用此代码,以下输入提供了以下信息:

  • 111.111,11

    111111,11

  • 111111.11

    111111.11

  • 111111

    111111


完成此步骤后,现在可以轻松修改字符串以满足您的需要。

第一个答案:

这与
,#####和##0.00
匹配:

^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$
^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$
这与
########0,00

^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$
^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$
将两者结合起来(有更聪明/更短的编写方法,但它是有效的):

您还可以在最后一个逗号(或点)上添加一个捕获组,以检查使用了哪一个


第二个答案:

正如Alan M所指出的,我以前的解决方案可能无法拒绝像
11111111.00
这样缺少逗号的值,但另一个没有。经过一些测试后,我达到了以下正则表达式,从而避免了此问题:

^[+-]?[0-9]{1,3}
(?:(?<comma>\,?)[0-9]{3})?
(?:\k<comma>[0-9]{3})*
(?:\.[0-9]{2})?$
这种变化捕获了使用的分离器:

^[+-]?[0-9]{1,3}
(?:
    (?:(?<thousand>\,)[0-9]{3})*
    (?:(?<decimal>\.)[0-9]{2})?
|
    (?:(?<thousand>\.)[0-9]{3})*
    (?:(?<decimal>\,)[0-9]{2})?
|
    [0-9]*
    (?:(?<decimal>[\.\,])[0-9]{2})?
)$
^[+-]?[0-9]{1,3}
(?:
(?:(?\,)[0-9]{3})*
(?:(?\.)[0-9]{2})?
|
(?:(?\.)[0-9]{3})*
(?:(?\,)[0-9]{2})?
|
[0-9]*
(?:(?[\.\,])[0-9]{2})?
)$

编辑1:“美分”现在是可选的; 编辑2:添加文本; 编辑3:添加第二个解决方案; 编辑4:添加完整的解决方案; 编辑5:添加标题; 编辑6:添加捕获;
编辑7:上一个答案分为两个版本;

参见Perl。

出于好奇,为什么会有一个模式,例如:11.111111,它与实际值(111111)相反只是为了证明这一点。这样用户就不必记住什么是正确的模式,这实际上是非常聪明的,因为世界上有许多国家使用逗号作为十进制分隔符。有关列表,请勾选此处:您如何处理111111?111111=111111。因此它没有小数:)这不会验证他的第一个例子;111.111,11正确。我没注意到那个。对不起。我会把锚移到交替的外面。您也可以将常用的前导和尾随元素移到它之外,但这不一定值得在可读性方面进行权衡可读性不是正则表达式的一个优点,但我同意。感谢投票:)刚刚注意到,数千个分隔符不应该是可选的;e、 例如,
(?:\.?[0-9]{3})*
应该是
(?:\[0-9]{3})*
。否则,您可以匹配像
11111111.00
1111.111,00
这样的内容。好的,但是如果您希望它们是可选的呢?现在,它是可选的,没有您指出的问题。:)我很确定这个答案是错误的,但我不能肯定,因为你并没有说你是如何使用正则表达式的(但这就是为什么要投反对票的充分理由)。您能解释一下如何区分千位分隔符和十进制分隔符(通过测试示例)?第一个正则表达式将通过查找最后出现的分隔符来确定什么是十进制分隔符。然后去掉另一个操作员的号码。你将得到一个没有千个分隔符的数字。剩下的应该是小菜一碟。稍后将发布示例代码。根据OP,111111中的逗号是千位分隔符(TS)。小数点分隔符(DS)如果存在,后面必须紧跟两位数字(他在问题的评论中澄清了这一点)。因此,您的第一个正则表达式必须以
([,.][0-9]{2})结尾。
就像OP的一样。但他也试图验证TS的分布是否正确。
^[+-]?[0-9]{1,3}
(?:
    (?:\,[0-9]{3})*
    (?:.[0-9]{2})?
|
    (?:\.[0-9]{3})*
    (?:\,[0-9]{2})?
|
    [0-9]*
    (?:[\.\,][0-9]{2})?
)$
^[+-]?[0-9]{1,3}
(?:
    (?:(?<thousand>\,)[0-9]{3})*
    (?:(?<decimal>\.)[0-9]{2})?
|
    (?:(?<thousand>\.)[0-9]{3})*
    (?:(?<decimal>\,)[0-9]{2})?
|
    [0-9]*
    (?:(?<decimal>[\.\,])[0-9]{2})?
)$