这是我写过的正则表达式,如果"$"
或"^"
被传递则返回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);
}
答案 0 :(得分:3)
问题是你的正则表达式的所有部分都是可选的,这意味着即使空字符串也会匹配你的正则表达式。即使传入了一些无效的字符串,它仍然会匹配输入开头的零长度子字符串。
另外,你已经逃过了斜线。在逐字字符串文字(以@
开头的字符串文字)中不需要这样做。字符串常规字符串文字"foo\\bar"
等同于逐字文字@"foo\bar"
。
我认为您需要在模式中添加start(^
)和end($
)锚点:
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 '()&#/\\+;:-]*$");
答案 1 :(得分:1)
如果你看一下你的比赛,每组以一个?使所有部分都可选:
(
(
[a-zA-Z][0-9a-zA-Z+\\-\\.]*:
)?
/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?
(
#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?
我必须重新格式化以确认它。