C#中的正则表达式问题返回matchtrue

本文关键字:返回 matchtrue 问题 正则表达式 | 更新日期: 2023-09-27 18:29:20

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

C#中的正则表达式问题返回matchtrue

问题是正则表达式的所有部分都是可选的,这意味着即使是字符串也会与正则表达式匹配。即使传入了一些无效字符串,它仍然会在输入的开头匹配一个零长度的子字符串。

此外,你还躲过了斜杠。这在逐字逐句的字符串文字(以@开头的字符串文字)中是不必要的。字符串常规字符串文字"foo''bar"等效于逐字逐句文字@"foo'bar"

我想您应该将开始(^)和结束($)锚添加到您的模式中:

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 '()&#/''+;:-]*$");

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

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

我不得不按照上面的方式重新格式化以确认它。