我想验证一个十进制数 ( decimal[19,3]
)。我用这个
@"[\d]{1,16}|[\d]{1,16}[\.]\d{1,3}"
但它没有用。
以下是有效值:
1234567890123456.123
1234567890123456.12
1234567890123456.1
1234567890123456
1234567
0.0
.1
我想验证一个十进制数 ( decimal[19,3]
)。我用这个
@"[\d]{1,16}|[\d]{1,16}[\.]\d{1,3}"
但它没有用。
以下是有效值:
1234567890123456.123
1234567890123456.12
1234567890123456.1
1234567890123456
1234567
0.0
.1
简化:
\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
(在上面更正)。
这将符合您的 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})$
遵循正则表达式将帮助您 -
@"^(\d{1,16}(\.\d{1,3})?|\.\d{1,3})$"
尝试类似的东西
(\d{0,16}\.\d{0,3})|(\d{0,16})
它适用于您的所有示例。
编辑。新版本 ;)
你可以试试:
^\d{0,16}(?:\.|$)(?:\d{0,3}|)$
匹配 0 到 16 个数字,然后匹配一个点或字符串的结尾,然后再匹配 3 个数字