javascript / regex中的字符串匹配

时间:2015-05-12 03:25:57

标签: javascript regex

匹配包含相同短语的两个字符串的最佳方法是什么?例如,有一种匹配以下两个字符串的好方法:

st1 = 'jenissplendidicecreams'
st2 = 'jenisicecream'

匹配这两个字符串的正确正则表达式是什么?

4 个答案:

答案 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');