【问题标题】:Regular expression to match a phrase, accepting a minimal amount of characters匹配短语的正则表达式,接受最少数量的字符
【发布时间】:2012-02-10 15:30:54
【问题描述】:

我想要一个从文本开头开始匹配单词的正则表达式。如果键入的确切字词匹配,但也会匹配某个最小数量的匹配字符,只要任何其他字符也匹配

例如,如果我尝试匹配“旧金山”,但愿意接受前五个字符足以在域中唯一标识它:

  • 比赛: 旧金山
  • 比赛: San F
  • 比赛: 旧金山
  • 比赛: 旧金山blahblah
  • 失败:波士顿
  • 失败:圣地亚哥
  • 失败: 圣弗朗西斯科
  • 失败: 圣弗拉诺

几乎有效,但与最后两个不匹配:

^San Fr?a?n?c?i?s?c?o?

我正在使用 .NET 正则表达式,但任何语言的解决方案都可以。

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    必须是正则表达式吗?使用简单的字符串比较会容易得多。

    bool matches(string input, string phrase, int minimumLength)
    {
        int compareLength = Math.Min(input.Length, phrase.Length);
        return input.Length >= minimumLength
            && input.Substring(0, compareLength ) == phrase.Substring(0, compareLength );
    }
    

    如果它必须是正则表达式,那么...

    "^San F(r(a(n(c(i(s(c(o.*)?)?)?)?)?)?)?)?$"
    

    【讨论】:

      【解决方案2】:

      您遇到的问题是分组问题之一。

      ^San F(r(a(n(c(i(s(c(o)?)?)?)?)?)?)?)?
      

      括号将使允许的“a”依赖于前面的“r”,依此类推。它仍然会匹配 'San Frano' 和 'San Fransisko',但匹配只会是 'San Fran',类似于您的 'San Fransiscoblahblah' 案例。

      【讨论】:

        【解决方案3】:

        也许你这里需要的不是一个简单的正则表达式,而是一种计算两个给定字符串的距离甚至相似度的方法?

        如果是这样,请查看 Levenstein 算法来计算字符串之间的距离。

        这有帮助吗?

        【讨论】:

          【解决方案4】:

          如果它需要是正则表达式,那么这将起作用:

          (^San Fr)(ancisco.*|ancisc|ancis|anci|anc|an|a)?\b
          

          在哪里

          x|y - 匹配 x 或 y。例如,“z|wood”匹配“z”或 “木头”。 "(z|w)oo" 匹配 "zoo" 或 "wood"。

          \b - 匹配单词边界,即单词和空格之间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配 “动词”中的“呃”。

          这将导致匹配是整个短语 - 如果有匹配项。并且没有像 San Frano 这样的部分匹配。

          你可以玩above example at Regexr

          【讨论】:

            猜你喜欢
            • 2017-04-19
            • 1970-01-01
            • 2016-06-12
            • 1970-01-01
            • 1970-01-01
            • 2014-01-05
            • 1970-01-01
            • 1970-01-01
            • 2020-10-17
            相关资源
            最近更新 更多