C#中的正则表达式问题返回匹配true

时间:2013-08-28 21:52:52

标签: c# .net regex

这是我写过的正则表达式,如果"$""^"被传递则返回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);
}

2 个答案:

答案 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;/?:@&=+$\\.\\-_!~*'()%]+
)?

我必须重新格式化以确认它。