【问题标题】:Regular expression for decimals that are accepted in decimal.Parse在 decimal.Parse 中接受的小数的正则表达式
【发布时间】:2016-04-02 14:22:35
【问题描述】:

期望的结果是一个不会在decimal.Parse 中引发异常并且不接受01-model-like 输入的正输入模式。

有效输入:

1
1.2
.2
1.

无效输入:

01
01.2
.
1.B
A.2
A
A.

我喜欢这个answer (-?(0|([1-9]\d*))(\.\d+)?) 中的模式;但不知何故(如评论中所述),它接受X.2(仅限Regex.IsMatch)和负小数,并拒绝1.;所以我将其修改为/((0|([1-9]\d*))(\.\d*)?)|(\.\d+)/g,它在regexr.com 和RegExr v1 中都能完美运行;但我对Regex.IsMatch 没有运气。

有什么建议吗?为什么该模式不适用于 Regex.IsMatch 而它在其他地方也可以使用?

【问题讨论】:

  • 0.5 怎么样?这是一个有效的输入吗?
  • 以下答案能回答您的问题吗?如果是,请接受可行的那个。
  • @MaheshChand;是的。
  • @WiktorStribiżew;我为迟到而道歉。该模式完美无缺;如果您发布答案,我会投票赞成(已选择最佳答案)。

标签: c# regex search text decimal


【解决方案1】:

这通过了你的所有测试:

var reg = new Regex("^(([1-9]*[0-9](\\.|(\\.[0-9]*)?))|(\\.[0-9]+))$");

(reg.IsMatch("1") == true).Dump();
(reg.IsMatch("1.2") == true).Dump();
(reg.IsMatch(".2") == true).Dump();
(reg.IsMatch("1.") == true).Dump();

(reg.IsMatch("01") == false).Dump();
(reg.IsMatch("01.2") == false).Dump();
(reg.IsMatch(".") == false).Dump();
(reg.IsMatch("1.B") == false).Dump();
(reg.IsMatch("A.2") == false).Dump();
(reg.IsMatch("A") == false).Dump();
(reg.IsMatch("A.") == false).Dump();

解释:

我们尝试尽可能多地捕获 1-9 个数字。这不包括前导 0。然后我们允许小数点前的任何数字。

那么我们有三种情况:无小数点、小数点、小数点后面有数字。

否则,如果我们以小数点开头,我们允许任何数字,但至少在其后有一个。这不包括.

【讨论】:

    【解决方案2】:

    您必须删除开头的“/”字符。由于在Javascript/ECMAScript中指定正则表达式的开头是正则表达式的语法,而不是c#。(参考:What does the forward slash mean within a JavaScript regular expression?)因此,最终的正则表达式是

    ((0|([1-9]\d*))(\.\d*)?)|(\.\d+)/g
    

    【讨论】:

    • 好吧!它与有效输入一起工作;但对于无效的,它确实接受了:01、01.2、1.B 和 A.2。
    【解决方案3】:

    我想这个简单的正则表达式应该可以很好地完成这项工作/-?(0?\.\d+|[1-9]\d*\.?\d*)/g

    您没有要求它,但它也可以处理负面因素。如果不需要,只需删除开头的-? 并使其更简单。

    【讨论】:

    • 我删除了-?;它返回了false 以及问题中提到的所有输入。
    • 请在regexr.com/3d4va 处检查您的输入... 是否在前面使用-?
    • 您评论中提到的模式工作正常,尽管它与您的答案中的模式不同;不过,感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多