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

时间:2012-02-10 15:30:54

标签: .net regex

我想要一个正则表达式,从文本的开头开始,匹配一个单词。如果输入的确切单词匹配,但也会匹配特定数量的匹配字符,前提是任何其他字符也匹配

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

  • 匹配: 旧金山
  • 匹配: San F
  • 匹配: San Fra
  • 匹配: 旧金山 blahblah
  • 失败:波士顿
  • 失败:圣地亚哥
  • 失败: San Fransisko
  • 失败: San Frano

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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

(^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

答案 3 :(得分:0)

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

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

这有帮助吗?