6

我想验证一个十进制数 ( decimal[19,3])。我用这个

@"[\d]{1,16}|[\d]{1,16}[\.]\d{1,3}" 

但它没有用。

以下是有效值:

1234567890123456.123
1234567890123456.12
1234567890123456.1 
1234567890123456
1234567
0.0
.1
4

5 回答 5

8

简化:

\d不必在[]. []仅在要检查字符是否为多个字符或字符类之一时使用。

.不需要在内部转义[]-[\.]似乎只是 allow .,但允许\出现在字符串中代替 the.可能是一种依赖于语言的可能性(?)。或者你可以把它拿出来[]并让它逃跑。

所以我们得到:

\d{1,16}|\d{1,16}\.\d{1,3}

(可以使用可选的 /“一次或根本不”量词 ( ?)将其缩短
     为\d{1,16}(\.\d{1,3})?)

更正:

您可能希望将第二个设为\d{1,16}可选,或者等效地简单地设为 make it \d{0,16},因此.1允许使用类似的内容:

\d{1,16}|\d{0,16}\.\d{1,3}

如果1.还应该允许类似的东西,你需要.在第一部分添加一个可选的:

\d{1,16}\.?|\d{0,16}\.\d{1,3}

编辑:我的印象是[\d]匹配\d,但它实际上匹配字符类\d(在上面更正)。

于 2013-06-03T12:33:38.627 回答
2

这将符合您的 3 个场景

^(\d{1,16}|(\d{0,16}\.)?\d{1,3})$

第一部分:一个 0 到 16 位数字

秒:一个 0 到 16 位的数字,带有 1 到 3 位小数

第三:在点之前没有任何内容,然后是 1 到 3 位小数

^$是匹配行首和行尾的锚点,因此如果您需要在文本行内搜索数字,您应该删除它们。

测试数据:

在此处输入图像描述

C#中的用法

string resultString = null;
try {
    resultString = Regex.Match(subjectString, @"\d{1,16}\.?|\d{0,16}\.\d{1,3}").Value;
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

轻微优化

更复杂一点的正则表达式,但更正确的是?:在“内部”组中使用符号,如果您不使用它,则使其成为非捕获组,如下所示:

^(\d{1,16}|(?:\d{0,16}\.)?\d{1,3})$
于 2013-06-03T12:41:26.573 回答
1

遵循正则表达式将帮助您 -

@"^(\d{1,16}(\.\d{1,3})?|\.\d{1,3})$"
于 2013-06-03T12:38:44.930 回答
0

尝试类似的东西

(\d{0,16}\.\d{0,3})|(\d{0,16})

它适用于您的所有示例。

编辑。新版本 ;)

于 2013-06-03T12:34:02.683 回答
-1

你可以试试:

^\d{0,16}(?:\.|$)(?:\d{0,3}|)$

匹配 0 到 16 个数字,然后匹配一个点或字符串的结尾,然后再匹配 3 个数字

于 2013-06-03T12:34:32.420 回答