这是我写的正则表达式,如果传递了"$"或"^",它返回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 '()&#/\\+;:-]*$");
