【问题标题】:Regular Expression Not working in .net正则表达式在.net中不起作用
【发布时间】:2012-03-10 05:39:40
【问题描述】:

我正在使用以下表达式。

\W[A-C]{3}

目标是匹配 A 和 C 之间没有任何字符的任何字符的 3 个字符。因此,输入“ABC”匹配但“DABC”不匹配。

当我使用各种在线正则表达式工具(例如http://gskinner.com/RegExr/)尝试这个表达式时,它可以完美运行。当我尝试在 asp.net RegularExpressionValidator 或 RegEx 类中使用它时,它永远不会匹配任何东西。

我尝试了各种不同的方法来禁止在比赛前出现字符。例如。

[^\w] and [^a-zA-Z0-9]

都可以在在线工具中使用,但不能在 .net 中使用。

这个测试失败了,但我不知道为什么?

[Test]
public void RegExWorks()
{
    var regex = new Regex("\\W[A-C]{3}");
    Match match = regex.Match("ABC");
    Assert.IsTrue(match.Success);
}

【问题讨论】:

    标签: c# asp.net regex validation


    【解决方案1】:

    这样的事情怎么样:

    ^[A-C]{3}
    

    这很简单,但似乎符合您的要求,我在 rubular.com 和 .NET 中对其进行了测试

    【讨论】:

    • 是的,你的权利它确实有效。但奇怪的是,当我在gskinner.com/RegExr 上尝试它时它不起作用 - 我不确定 3 个答案中的哪一个是最好的?他们都工作
    • 这是非常标准的 reg ex,所以我不确定为什么它在那里不起作用。如果你去注册前网站,那就是......
    【解决方案2】:

    问题是您要求有一个\W 字符。使用更改来解决这个问题,或者使用后视来确保没有无效字符。

    改动:

    (?:\W|^)[A-C]{3}
    

    但我更喜欢消极的回顾:

    (?<!\w)[A-C]{3}
    

    \b(如gymbralls 的回答)是(?&lt;!\w)(?=\w)|(?&lt;=\w)(?!\w) 的缩写,在这种情况下,它的意思是(?&lt;!\w),因此是等价的。

    此外,在 C# 中,您可以使用 @ 引用,因此您不必双重转义,例如:

    var regex = new Regex(@"(?<!\w)[A-C]{3}");
    

    【讨论】:

      【解决方案3】:

      您应该考虑尝试:

      [Test]
      public void RegExWorks()
      {
         var regex = new Regex("\\b[A-C]{3}");
         Match match = regex.Match("ABC");
         Assert.IsTrue(match.Success); 
      }
      

      \\b 匹配单词边界,这意味着它将匹配“ABC”以及“ABC”和“$ABC”。使用\\W 需要有一个非单词字符,这听起来不像你想要的。

      如果我遗漏了什么,请告诉我。

      【讨论】:

      • 对不起,我的问题不是很清楚,我想确保比赛前没有任何字符。我想 \w 涵盖了我需要的东西。我认为第一个答案中的负面回溯让我得到了我需要的东西。我不希望它匹配“$ABC”。
      • @Robbie,我的回答中的后视匹配。你只想要^[A-C]{3}$吗? ABC 前允许使用哪些字符?如果你只想允许空白,你可以使用(?&lt;!\S)[A-C]{3}
      • 是的,我认为 ^ 是我想要的...我在比赛前不想要任何字符...它应该只匹配输入开始时的内容。我认为这是贾斯汀在回答中所说的
      • 知道了。根据您提到不希望它与“DABC”匹配的问题,听起来您希望它仅匹配这三个字符,即使它们之前还有其他字符。我们可能想要编辑问题以使其更清晰。无论哪种方式,我都很高兴您找到了您正在寻找的解决方案。
      • 我不确定我是否理解问题中的歧义?我说“A 和 C 之间没有任何字符的任何字符的 3 个字符”。你的意思是我应该说“任何东西”而不是“任何字符”?
      【解决方案4】:

      很简单,比如“[A-C]{3}”这个

      【讨论】:

      • 这不能确保匹配出现在我需要的输入的开头。
      【解决方案5】:

      好的,你可以试试下面的表达式

      “[A-C][A-C]{2}”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-08
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-18
        相关资源
        最近更新 更多