这是我写的正则表达式,如果传递了"$"
或"^"
,它返回true。为什么我只指定了它返回true以下字符应匹配
public static bool IsTrue(string test)
{
Regex regex = new Regex(@"(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?");
return regex.IsMatch(test);
}
最佳答案
问题是您的正则表达式的所有部分都是可选的,这意味着即使是空 字符串也会匹配您的正则表达式。即使传入了一些无效字符串,它仍然会匹配输入开头的零长度子字符串。
此外,您已经逃脱了斜杠。这在逐字字符串文字(以 @
开头的字符串文字)中不是必需的。字符串常规字符串文字 "foo\\bar"
等同于逐字文字 @"foo\bar"
。
我想你会想在你的模式中添加开始 (^
) 和结束 ($
) anchor :
new Regex(@"^(([a-zA-Z][0-9a-zA-Z+\-.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$.\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$.\-_!~*'()%]+)?$");
这将使 ^
失败,但空字符串仍然匹配(因为所有部分仍然是可选的)并且 $
仍然是有效输入。如果没有关于您想要匹配什么和不想匹配什么的更多信息,很难准确地说出如何修改此模式。
根据您的意见,如果您只想将输入限制为几个字符,您可以简单地使用模式:
new Regex(@"^[A-Za-z0-9 '()&#/\\+;:-]*$");
关于c# - C# 中的正则表达式问题返回匹配为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498852/