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);
}
问题是正则表达式的所有部分都是可选的,这意味着即使是空字符串也会与正则表达式匹配。即使传入了一些无效字符串,它仍然会在输入的开头匹配一个零长度的子字符串。
此外,你还躲过了斜杠。这在逐字逐句的字符串文字(以@
开头的字符串文字)中是不必要的。字符串常规字符串文字"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;/?:@&=+$''.''-_!~*'()%]+
)?
我不得不按照上面的方式重新格式化以确认它。