正则表达式的正则表达式验证十进制[19,3]

时间:2013-06-03 12:28:49

标签: regex

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

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

但它不起作用。

以下是有效值:

1234567890123456.123
1234567890123456.12
1234567890123456.1 
1234567890123456
1234567
0.0
.1

5 个答案:

答案 0 :(得分:8)

<强>简化:

\d不一定在[]。仅当您要检查字符是否是多个字符或字符类之一时才使用[]

.不需要在[]内转义 - [\.]似乎只允许.,但允许\出现在字符串中.的位置可能是语言相关的可能性(?)。或者你可以把它从[]中拿出来并保持它逃脱。

所以我们来:

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

(可使用可选/“一次或完全不”量词(?)缩短 到\d{1,16}(\.\d{1,3})?

<强>更正:

您可能希望将第二个\d{1,16}设为可选,或者等效地将其设为\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匹配(上面已更正) )。

答案 1 :(得分:2)

这将匹配您的3个场景

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

第一部分:0到16位数字

秒:0到16位数,1到3位小数

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

^$是匹配行首和行尾的锚点,因此如果您需要在文本行中搜索数字,则应删除这些数字。

<强> TESTDATA:

enter image description here

在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})$

答案 2 :(得分:1)

以下Regex将帮助您 -

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

答案 3 :(得分:0)

尝试类似的东西

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

它适用于您的所有示例。

修改。新版;)

答案 4 :(得分:-1)

您可以尝试:

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

匹配0到16位数 然后匹配一个点或一个字符串的结尾 然后匹配3个以上的数字