1

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

2 回答 2

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 '()&#/\\+;:-]*$");
于 2013-08-28T22:00:05.867 回答
1

如果您查看您的比赛,每组都以 ? 使所有部件可选:

(
    (
        [a-zA-Z][0-9a-zA-Z+\\-\\.]*:
    )?
    /{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?
(
    #[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+
)?

我必须如上所述重新格式化以确认它。

于 2013-08-28T22:03:37.607 回答