首页 文章

正则表达式匹配短语,接受最少量的字符

提问于
浏览
4

我想要一个正则表达式,从文本的开头开始,匹配一个单词 . 如果输入的确切单词匹配,但也匹配某个最小数量的匹配字符 provided that any additional characters also match .

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

  • 匹配: San Francisco

  • 匹配: San F

  • 匹配: San Fra

  • 匹配: San Francisco blahblah

  • 失败:波士顿

  • 失败:圣地亚哥

  • 失败:San Fransisko

  • 失败:圣弗朗索

这几乎可以工作,但错误地匹配最后两个:

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

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

4 回答

  • 3

    您遇到的问题是分组问题 .

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

    括号将使它成为允许'a'取决于前面的'r',依此类推 . 它仍然会在'San Frano'和'San Fransisko'上匹配,但比赛只会是'San Fran',类似于你的'San Fransiscoblahblah'案 .

  • 0

    它必须是正则表达式吗?使用简单的字符串比较更容易 .

    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.*)?)?)?)?)?)?)?)?$"
    
  • 4

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

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

    这有帮助吗?

  • 0

    如果需要成为RegEx,那么这将有效:

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

    哪里

    x | y - 匹配x或y . 例如,“z | wood”匹配“z”或“wood” . “(z | w)oo”匹配“zoo”或“wood” . \ b - 匹配单词边界,即单词和空格之间的位置 . 例如,“er \ b”匹配“never”中的“er”而不匹配“verb”中的“er” .

    这将导致匹配成为整个短语 - 如果匹配 . 对于像 San Frano 这样的事情没有部分匹配 .

    你可以玩above example at Regexr

相关问题