匹配德国电话号码的正则表达式

5
我在想,德国文化下用于测试数字正确格式的正则表达式会是什么样子。
在德语中,逗号作为小数点,而句点用于分隔千位。
因此:
- 1.000 等同于 1000 - 1,000 等同于 1 - 1.000,89 等同于 1000.89 - 1.000.123.456,89 等同于 1000123456.89
真正的技巧,似乎在于确保可以有多个点,后面可能跟着逗号分隔符。

1
您是想限制只允许正确的德语输入吗?还是只是试图将用户输入的任何内容转换为“普通”数字?(在您最后的示例中,我认为您的意思是 _1000123456.89_,它仍然有一个逗号) - asontu
感谢您指出上一个示例中的错误(已更正)。我只是试图限制用户插入无效输入。 - Zbynek
有时验证数字的最佳方法是使用您的语言/框架的区域敏感解析方法。在.NET中,这将是float.Parse。 - Simon MᶜKenzie
解析数字我可以处理,但我想限制用户插入无法解析的字符串。 - Zbynek
6个回答

12

我会使用以下正则表达式:

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

正则表达式可视化

Debuggex演示

这是一个代码示例,将它解释为有效的浮点数(注意字符串替换后的parseFloat())。

编辑:正如Severin Klug的回答中所提到的,下面的代码假定数字已知为德国格式。尝试“检测”字符串是否包含德国格式或美国格式数字是不确定的,超出了此问题的范围。'1.234'在两种格式中都是有效的,但实际值不同,没有上下文无法确定意味着哪种格式。

var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89'];

document.getElementById('out').value=numbers.map(function(str) {
  return parseFloat(str.replace(/\./g, '').replace(',', '.'));
}).join('\n');
<textarea id="out" rows="10" style="width:100%"></textarea>


运行良好!我将其扩展到两个“分”位数。^-?\d{1,3}(?:.\d{3})*(?:,\d{0,2})?$ - SenioreT

3

我本想将这个内容作为评论发布,但是由于我的声望不够,无法进行评论。 @funkwurm, 你的帖子https://dev59.com/RIfca4cB1Zd3GeqPk5vG#28361329包含了JavaScript代码。

var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89', '1.2'];
numbers.map(function(str) {
  return parseFloat(str.replace(/\./g, '').replace(',', '.'));
}).join('\n');

这段代码的功能是将德语数字转换为英文/国际数字。对于在德国千分点后恰好有三位数字的每个数字,它都能成功执行转换,就像你在示例数组中使用的数字一样。但是,这里存在一个关键的用例错误:它也会删除任何其他具有不到三个数字的点的字符串。

因此,如果插入类似“1.2”的字符串,它返回的结果是12;如果插入“1.23”,则返回的结果是123。

这是一个非常关键的行为,如果有人只是简单地采用上述代码片段,并认为它可以将任何给定数字正确转换为英文数字,那么已经正确的英文数字将被损坏!所以请小心使用。


我现在才看到这个答案是作为回复的。现在我看到你已经有了所需的声望 :) 我添加了一个澄清。 - asontu

1
这个正则表达式应该可以工作:

([0-9]{1,3}(?:\.[0-9]{3})*(?:\,[0-9]+)?)

0
一个好的正则表达式应该是这样的:
Regex regex = new Regex("-?\d{1,3}(?:\.\d{3})*(?:,\d+)?");
Match match = regex.Match(input);
Decimal result = Decimal.Zero;
if (match.Success)
     result = Decimal.Parse(match.Value, new CultureInfo("de-DE"));

结果是解析后的德国数字值。

非常接近了,但是当它应该被验证时,“100.000”将无法通过验证 :) - asontu
你是正确的,我把2改成3了,这样它就和小数点前的3位匹配了。 - Casperah

-1

试试这个,它会匹配你的输入:

^(\d+\.)*\d+(,\d+)?

-1

这个正则表达式适用于正数

/^[0-9]{0,3}(\.[0-9]{3})*(,[0-9]{0,2})?$/

细分

  • [0-9]{0,3} - 此部分允许零到三个数字。空值有效,'1'、'26'、'789' 都是有效的。'1589' 无效。

  • (\.[0-9]{3})* - 此部分允许零个或多个点... 如果有一个点,则必须在点后面有三个数字。'2.589' 是有效的。'2.5896' 和 '2.45' 无效。

  • (,[0-9]{0,2})? - 此部分允许零个或一个逗号。逗号后可以有零到两个数字。'25,'、'25,5'、'25,45' 都是有效的。'25,456' 和 '25,45,8' 无效。

希望这对您有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接