我想要一个正则表达式,从文本的开头开始,匹配一个单词。如果输入的确切单词匹配,但也会匹配特定数量的匹配字符,前提是任何其他字符也匹配。
例如,如果我正在尝试匹配“旧金山”,但我愿意接受前五个字符足以在域中唯一地识别它:
此几乎有效,但与最后两个错误匹配:
^San Fr?a?n?c?i?s?c?o?
我正在使用.NET正则表达式,但任何语言的解决方案都可以。
答案 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算法来计算字符串之间的距离。
这有帮助吗?