C# 这是.NET正则表达式中的错误还是功能?

C# 这是.NET正则表达式中的错误还是功能?,c#,regex,.net-4.5,C#,Regex,.net 4.5,我正在学习C#regex,正在尝试: String pattern = @"\(([0-9]+ *, *)*[0-9]+\)"; Regex reg = new Regex(pattern); if (!reg.IsMatch(TestGroupIDs)) throw new Exception("Invalid TestGroupIDs string in App.config. The proper format is: (4,6)"); 应该验证以下任何字符串:“(3)”,“(3

我正在学习C#regex,正在尝试:

String pattern = @"\(([0-9]+ *, *)*[0-9]+\)";
Regex reg = new Regex(pattern);
if (!reg.IsMatch(TestGroupIDs))
    throw new Exception("Invalid TestGroupIDs string in App.config. The proper format is: (4,6)");
应该验证以下任何字符串:
“(3)”
“(3,4,5)”
“(3,4)”
“(3,4)”
,等等

我对这个字符串进行了测试:
“(4,6)或1=1”
,正则表达式匹配。在尝试了其他一些类似的情况后,我发现.NET正则表达式将
或1=1“
部分视为布尔表达式。这是.NET中的错误吗?有工作吗


鉴于人们不相信我,我将展示一些我尝试过的案例:

“(4,6)| | 1=1”
=>
DesktopMonitor.exe中发生了类型为“System.NullReferenceException”的第一次意外异常,该异常在“|”附近的语法不正确。

“(4,6)或1”
=>
在预期条件的上下文中指定的非布尔型表达式,靠近“1”。

我相信这些结果应该证实我的观点


谢谢@false和@Rawling纠正我的错误。见下文@false的答案。 带走:

  • 在下结论之前使用调试器
  • 相信微软,即使他们生产的手机和浏览器很糟糕。(jk、WP和IE现在实际上相当不错)
  • 我发现C#Regex将“OR 1=1”部分视为布尔表达式

    不,它完全忽略了它。您正在检查正则表达式是否与字符串匹配:

    (4,6) OR 1=1
    
    嗯,是的!就在这里:

    (4,6) OR 1=1
    -----
    
    如果要验证字符串,通常需要将正则表达式锚定到字符串的开头和结尾,分别为
    ^
    $
    ,因此它只能匹配整个字符串

    String pattern = @"^\(([0-9]+ *, *)*[0-9]+\)$";
    

    我想你忘了开头和结尾的字符了。应该是:

    "^\(([0-9]+ *, *)*[0-9]+\)$"
    

    检查此处以获取正则表达式帮助:

    我尝试的regex.IsMatch()不是这样的:“(4,6)| | 1=1”我得到的结果是:
    DesktopMonitor.exe中发生了类型为“System.NullReferenceException”的第一次意外异常“|”附近的语法不正确谢谢您的快速回复response@TengyuLiu:该错误发生在您正在进行的某个查询中;它与正则表达式无关
    | |
    是标准SQL中的字符串连接运算符。我建议您不要像那样将用户输入输入到查询中;一定有某种方法可以将列表作为参数传递。@TengyuLiu:那,嗯……显然不是真的。您正在使用调试器吗?检查哪一行给了你错误。@TengyuLiu不是。尝试
    Regex.IsMatch(“ab”,“a”)
    ,您将得到正确答案。这并不意味着它将
    b
    视为一个布尔表达式。这看起来很像(给出了失败字符串的示例)您试图使用正则表达式来保护自己不受SQL注入的影响。那是做这项工作的错误工具。使用参数。是的,我知道。我只是想知道为什么会发生这种情况。另外,仅供参考,与JavaScript不同,C#编程语言不支持正则表达式。您所问的是.NET正则表达式,而不是C#正则表达式。@JohnSaunders非常感谢。我对Windows编程还不熟悉,但仍在努力找出它们之间的区别。