正则表达式接受部分匹配。

3

我有一些验证代码,可以将字符串与正则表达式进行比较。

Regex regex = new Regex(RegexPattern);
if (!regex.IsMatch(value))
{
    errorMessage = "The data is not in the correct format.";
    return false;
}

如果我将正则表达式模式设置为^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$,它会正确接受1.0.0.0;但是,它也会接受1.0.0.
如何修改模式使其接受1.0.0.0,但拒绝1.0.0.
4个回答

5

[0-9]* 表示出现 0 次或多次的 [0-9]

[0-9]+ 表示出现 1 次或多次的 [0-9]

^[0-9]*.[0-9]*.[0-9]*.[0-9]*$

*更改为+

^[0-9]+.[0-9]+.[0-9]+.[0-9]+$

是的,这就是我所缺少的。谢谢。 - Jonathan Wood
这种情况经常发生,你已经做了100多次的事情,却因为一个简单而愚蠢的错误而无法找到问题所在。我也经常犯这种错误;)很高兴能帮忙。 - Ashkan Mobayen Khiabani
这是否应该匹配 1234567 - user557597
@sln 不行,因为必须有三个点分隔的数字。 - Ashkan Mobayen Khiabani
^[0-9]+.[0-9]+.[0-9]+.[0-9]+$ matches 1234567 - user557597

2

关于 * 和 +,有一点小误解。前者可以接受零个或多个(>=0)匹配项,而后者只有在至少出现一次(>=1)时才匹配。

^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$

为了安全起见,我通常也会转义句点,但不确定是否必要,因此仍然这样做。:)


0
匹配由句点分隔的4组数字。

^\d+(?:\.\d+){3}$


0
你可以使用这个模式:
^\d+\.\d+\.\d+\.\d+$

解释:

 ^ - begin of string
   \d - any digit
   + - at least one char
   \. - exactly a dot char
 $ - end of string

顺便说一下,你的输入看起来像一个IP地址。如果是这样,你可以像这样修改你的正则表达式:

^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$

{1,3} 的意思是:'由 1 到 3 个字符'

演示:regex101


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接