【问题标题】:How do I match an entire string with a regex?如何将整个字符串与正则表达式匹配?
【发布时间】:2011-05-06 15:00:28
【问题描述】:

我需要一个正则表达式,它只会在整个字符串与我的查询匹配的地方找到匹配项。

例如,如果我搜索名称为“红色十月”的电影,我只想匹配该确切标题(不区分大小写),而不匹配“寻找红色十月”之类的标题。不太确定我知道该怎么做。有人知道吗?

谢谢!

【问题讨论】:

  • 为什么你需要一个正则表达式来处理一个简单的string.Contains 可以工作的东西?
  • 我需要使用正则表达式的原因是我正在使用它在 MongoDB 中进行搜索,并且我需要它不区分大小写,这只能使用正则表达式来完成
  • 为什么不将(即时)数据库数据转换为小写和用户小写字符串以进行搜索?
  • @macias 我不同意这将是一个更好的选择,但不幸的是我目前的情况不允许这样做。
  • 仅供参考,如果不需要使用正则表达式,只需尝试比较两个忽略大小写的字符串,可以简单地执行string1.Equals(string2, StringComparison.OrdinalIgnoreCase);

标签: c# .net regex


【解决方案1】:

试试下面的正则表达式:

^Red October$

默认情况下,正则表达式区分大小写。 ^ 标记匹配文本的开始,$ 标记结束。

【讨论】:

  • 仅供参考,值得一提的是,为了使其不区分大小写,在创建正则表达式对象时,添加第二个参数 RegexOptions.IgnoreCase。
  • 如果该字符串周围有其他任何东西,这将无法工作。例如,如果您在 Street 中搜索“St”,但在同一行中有其他字符串也以“St”开头,例如名称“Stirling”,则此正则表达式将不会进行完全匹配。不幸的是,我不确定 RegEx 是否是这种情况的正确答案。不过我会继续努力。下面蒂姆的回答很好,但并非所有引擎都支持这一点。
  • 实际上,$ 并不总是匹配字符串的结尾,\z 可以(\Z 在 Python 中是等价的)。请参阅Tim Pietzcker's answer。但对于 JavaScript 来说确实如此。
【解决方案2】:

通常,在默认设置下,^$ 锚是确保正则表达式匹配整个字符串的好方法。

但有几点需要注意:

如果您的正则表达式有变化,请务必将您的正则表达式包含在一个非捕获组中,然后再用^$ 包围它:

^foo|bar$

当然不同于

^(?:foo|bar)$

此外,如果某些选项是放。在支持正则表达式的文本编辑器中,这通常是默认行为。在某些语言中,尤其是 Ruby,这种行为甚至无法关闭。

因此有另一组锚点保证只匹配整个字符串的开头/结尾:

\A 匹配字符串的开头。

\Z 匹配字符串末尾或最后一个换行符之前。

\z 匹配字符串的末尾。

但并非所有语言都支持这些锚点,尤其是 JavaScript。

【讨论】:

  • 这是最有帮助的答案
  • 一个有趣的点我直到在这里看到它才研究它:?: 表示括号不算作捕获组(因此它们不会影响任何现有 REGEX 中的现有组号)。万一您使用的 REGEX 的风格不支持这一点,您也可以使用后视和前瞻(也是非捕获):(?<=^)foo|bar(?=$)
【解决方案3】:

使用^$ 修饰符来表示正则表达式模式相对于字符串开头和结尾的位置:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

【讨论】:

    【解决方案4】:

    我知道回答这个问题可能有点晚了,但也许对其他人来说会派上用场。

    最简单的方法:

    var someString = "...";
    var someRegex = "...";
    var match = Regex.Match(someString , someRegex );
    if(match.Success && match.Value.Length == someString.Length){
        //pass
    } else {
        //fail
    }
    

    【讨论】:

    • 恕我直言,这比公认的答案要简单。但它是另一种选择。
    • 我喜欢这个答案,因为代码本身显示了预期的行为,而不是修改正则表达式(对于那些对正则表达式了解甚少的人来说可能不太清楚)。潜在的问题是可以编写正则表达式,以便它可以匹配整个字符串或其中的一部分,即使可以完全匹配,Regex.Match 函数也会返回部分匹配。
    【解决方案5】:

    您需要将您的正则表达式括在^(字符串开头)和$(字符串结尾)中:

    ^Red October$
    

    【讨论】:

      【解决方案6】:

      抱歉,有点不清楚。

      根据我的阅读,您想做简单的字符串比较。你不需要正则表达式。

      string myTest = "Red October";
      bool isMatch = (myTest.ToLower() == "Red October".ToLower());
      Console.WriteLine(isMatch);
      isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());
      

      【讨论】:

      • 我需要使用正则表达式的原因是我正在使用它在 MongoDB 中进行搜索,并且我需要它不区分大小写,这只能使用正则表达式来完成。
      【解决方案7】:

      如果我只想捕获一次字符串中的字母减去 a 并且可以使用 myRegex.IsMatch() 进行检查,您可以像这个示例一样进行操作

      ^[^e][e]{1}[^e]$

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        相关资源
        最近更新 更多