【问题标题】:C# Regex for a french decimal用于法国小数的 C# 正则表达式
【发布时间】:2010-12-09 16:09:05
【问题描述】:

我一直在这个问题上花费数小时,到处寻找...... 我的问题很简单:我们要检查用户输入的正确数字。 它可以是整数或带逗号而不是点的小数,以及逗号后的无限数。

我试过了

 Regex decimalRegex = new Regex(@"\d+(,\d+)?");

我认为没问题,但例如:如果我尝试使用 IsMatch,2,324e 是真的。 此外,点和逗号之间没有区别,所以这个 2.23 可以使用 IsMatch 和我的正则表达式。

但我希望允许使用数字 2 :

2
2,2
2,3243241428483248
31324,232332 (infinite numbers before and after)

并禁止:

2.2
2,2434214e (any letter)

最好禁止(我认为 ? 可以解决问题,但事实并非如此)...

2,2,2 or
2.2.2

只允许昏迷一次... 否则我在法国文化中

正则表达式中的任何冠军都会有建议吗? 我什至下载了 Expresso 来完成这项工作,但我做不到..

【问题讨论】:

  • 等等...你的 RE 与 2.23 的匹配度如何?你说它找到 2.23 你确定它匹配 2.23 吗?
  • 我知道,点没问题我不知道为什么,它不应该但它通过了......我不明白为什么正则表达式看不到 , 和 之间的任何区别。跨度>

标签: c# .net regex


【解决方案1】:

你需要锚定表达式:

Regex decimalRegex = new Regex(@"^\d+(,\d+)?$");

如果没有^ 开头和$ 结尾,则表达式可以匹配您正在测试的字符串的任何子字符串。锚点一起禁止子串匹配。

换句话说,您的原始表达式将匹配任何包含至少一个数字的字符串。

【讨论】:

  • 谢谢,这正是我需要的,没想到锚
【解决方案2】:

为什么在设置正确的区域性后不使用 Int32.TryParse() 或 Double.TryParse() ?在您的问题中,您说的是 Int 或 Double,但随后又说了“逗号后的无限数字”。这些可能不是整数或双精度数,具体取决于它们的范围,TryParse 也会为您进行范围检查...

【讨论】:

    【解决方案3】:

    您几乎走在正确的轨道上;您需要的正则表达式是@"^(\d+(,\d*)?|,\d+)$" ^$ 强制正则表达式匹配字符串的开头和结尾,因此不允许有任何额外内容。如果没有这些,您的正则表达式将匹配1,2e 中的1,2,并认为这没问题——这也是2,2,2 起作用的原因,因为它匹配第一个2,2 而忽略其余部分。这就是2.2.2 匹配的原因——正则表达式匹配2,而忽略了其余部分。基本上,锚点非常有用 :-) 我更改的另一件事是添加了 ,\d+ 子句,它允许您匹配 ,123 形式的数字。如果你不想这样,把它拿出来(@"^\d+(,\d*)?$")。同样,如果您不想匹配123,,则将* 更改为+ (@"^\d+(,\d+)?$")。

    如果您愿意接受其他解决方案,您可以选择Ian's advice 并使用现有功能;我还建议将, 替换为[.,],这样人们就可以输入1,21.2,因为这不会真正伤害任何东西,但会让一些人的生活更轻松。 (除非你真的很担心成千上万的分隔符,或者有一些很深的理由不想要第二个。)

    【讨论】:

    • 谢谢你,很好的解释,它就像一个魅力,我不想用 . 替换 , 。因为我在玩小数,在法国文化中,它需要一个逗号来理解它。真的谢谢你,尤其是我想不通的主播..
    • @Yaelle: Je comprends—fais ce que tu veux。 :) 我很高兴这对你有用。
    猜你喜欢
    • 2021-02-06
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多