c# - C# 中的正则表达式问题返回匹配为真

标签 c# .net regex

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

我想你会想在你的模式中添加开始 (^) 和结束 ($) anchor :

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

关于c# - C# 中的正则表达式问题返回匹配为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498852/

相关文章:

c# - 在 C# 中在 Windows 7 上注册 dll

c# - 广播是否比特定端口的随机 SYN/ACK 扫描更快?

c# - POCO 的静态 INotifyPropertyChanged 生成器

c# - XML 文档中的引用运算符

c# - 将 URL 转换为 C# 字符串中的超链接的最简单方法?

c# - 我如何找到字符串 c# 中的最后一个数字?

c# - 任务线程和 Azure CloudBlobClient

javascript - 将 C# 正则表达式转换为 JavaScript 正则表达式

c# - 欧元货币字符不显示

android - Regex Number 支持 ","或 "/"