我想验证十进制数(decimal[19,3]
)。我用过这个
@"[\d]{1,16}|[\d]{1,16}[\.]\d{1,3}"
但它不起作用。
以下是有效值:
1234567890123456.123
1234567890123456.12
1234567890123456.1
1234567890123456
1234567
0.0
.1
答案 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:强>
在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个以上的数字