匹配包含相同短语的两个字符串的最佳方法是什么?例如,有一种匹配以下两个字符串的好方法:
st1 = 'jenissplendidicecreams'
st2 = 'jenisicecream'
匹配这两个字符串的正确正则表达式是什么?
答案 0 :(得分:2)
您需要构建一个如下所示的正则表达式:
/.*j.*e.*n.*i.*s.*i.*c.*e.*c.*r.*e.*a.*m.*/
如果被测试的字符串按顺序包含所有原始字符,但其中包含任意附加字符,则此正则表达式匹配。
我们可以通过
轻松地构建它function make_regexp(str) {
var letters = str.split('');
letters.push(''), letters.unshift('');
return new RegExp(letters.join('.*'));
}
> make_regexp('jenisicecream')
< /.*j.*e.*n.*i.*s.*i.*c.*e.*c.*r.*e.*a.*m.*/
现在测试第二个字符串是否匹配:
> make_regexp('jenisicecream').test('jenissplendidicecreams')
< true
答案 1 :(得分:1)
我不太确定,但我认为你可能正在寻找这样的东西?
var str1 = "I have some words!";
var str2 = "I have some very similar words!";
var min = 5;
var max = 6;
var len = str1.length;
for(var i = 0; i<len; i++)
{
for(var j = min; j<max; j++)
{
var re = new RegExp(str1.substring(i,j));
console.log(re);
//Do something when this returns true??
console.log(re.test(str2));
}
}
答案 2 :(得分:0)
有很多方法可以做到这一点。
您可以使用字符串方法:
var name = st1.slice(0, st1.indexOf("splendidicecream"));
return name == st2.slice(0, st2.indexOf("icecream"));
或者如果你真的想使用正则表达式:
var nameRe = /.+?(?=splendidicecream)/,
name = st1.match(nameRe)[0];
return st2.startsWith(name);
或更难的正则表达式:
var nameRe = /.+?(?=splendidicecream)/,
startsWithNameRe = new RegExp("^" + st1.match(nameRe)[0]);
return startsWithNameRe.test(st2);
答案 3 :(得分:0)
问题是计算机不知道单词的位置。您可以索引整个字典或使用指定距离的内容来获取值(如果string
是str2且str
是str1):
var distance = 8, // Best for your current case
end = new RegExp('.{'+distance+'}$', '').exec(string)[0],
start = new RegExp('^(.*)'+end+'$', '').exec(string)[1];
function matches (s) {
return new RegExp('^(?:'+start+').*(?:'+end+')$').test(s);
}
matches(str);
<小时/>
var min = 1, // Adjust depending on acceptance level
split = string.split('').reverse().map(function (a,i) {
if ( (i+1) % min === 0) {
return a + '.*';
} else {
return a;
}
}).reverse().join(''),
regex = new RegExp(split, '');
regex.test('jenissplendidicecreams');