我试图通过提供特定字符串来找到与单词最接近的匹配,例如:
所以我会:
"jonston" x "john" => "jo" //only "jo" is the part that matches
"joshua" x "john" => "jo"
"mark" x "marta" => "mar"
你可以看到我只想在序列匹配中检索字符,这就是为什么joshua
和john
只有jo
的共同序列,而不是joh
因为两者都有字母h
我使用以下方法尝试使用正则表达式:
"john".match(/["joshua"]+/) //=> outputs ["joh"] and not ["jo"]
有没有什么方法可以匹配匹配的第一个字符?
我将使用javascript实现
我希望这是有道理的
提前致谢
答案 0 :(得分:1)
var a = "john";
var b = "joshua";
var x = "";
for (var i = 0; i < a.length; i++) {
if (x == "" && i > 0) break;
else if (a[i] == b[i]) x += a[i];
else if (x != "") break;
}
console.log(x);
答案 1 :(得分:1)
又一个解决方案:
if(typeof String.prototype.commonFirstChars !== 'function') {
String.prototype.commonFirstChars = function(s) {
var common = "";
for(var i=0; i<this.length; i++) {
if(this[i] !== s[i]) {
return common;
}
common += this[i];
}
};
}
你可以像这样使用它:
var commonFirstChars = "john".commonFirstChars("joshua");
// "john".commonFirstChars("joshua") === "joshua".commonFirstChars("john")
这将返回:
jo
答案 2 :(得分:1)
initLCS = function(a, b) {
for (var i = 0; i < a.length && a[i] == b[i]; i++);
return a.substr(0, i);
}
initLCS("jonston", "john") // jo
initLCS("jonston", "j111") // j
initLCS("xx", "yy") // ""
如果你坚持使用正则表达式,它就是这样的:
initLCS = function(a, b) {
function makeRe(x) {
return x.length ? "(" + x.shift() + makeRe(x) + ")?" : "";
}
var re = new RegExp('^' + makeRe(b.split("")), "g");
return a.match(re)[0];
}
这将从第二个字符串创建一个类似/^(j(o(h(n)?)?)?)?/g
的表达式,并将其应用于第一个字符串。并不是说它有多大意义,只是为了它。
答案 3 :(得分:0)
你不能用正则表达式真正做到这一点。为什么不直接遍历两个字符串并比较索引?您可以选择字符,直到您使用不同的值在同一索引处点击字符。
答案 4 :(得分:0)
我会在这样的递归函数中执行此操作:
编辑:更新了示例,使其更具可读性。
var testWords = [
['ted', 'terminator'],
['joe', 'john'],
['foo', 'bar']
];
var matches = testWords.map(function(wordPair) {
return (function matchChars(word1, word2, matches) {
if (word1[0] !== word2[0]) {
return [wordPair[0], wordPair[1], matches];
}
matches = matches || '';
matches += word1[0];
return matchChars(word1.slice(1), word2.slice(1), matches);
}(wordPair[0], wordPair[1]));
});
console.log(matches.map(function(match) { return match.join(', '); }).join('\n'));
小提琴(已更新): http://jsfiddle.net/VU5QT/2/