如何在数组中找到匹配的字符串?

时间:2014-10-31 23:46:36

标签: javascript regex

我想从一个匹配多个子串的数组中获取完整的字符串元素,而不是特定的顺序。如果有多个匹配,则应抛出异常。

var thisArray = [ '/something_else/', '/and_something_else/', '/and_something_else_here/'];
var thisMatch = [ 'some', 'and', 'here'];

var matchingElement = new RegExp(thisArray , thisMatch); // Not sure about this

我想要的是matchineElement在执行正则表达式后包含字符串“and_something_else_here”

4 个答案:

答案 0 :(得分:2)

你可以这样做:

var thisArray = [ '/something_else/', '/and_something_else/', '/and_something_else_here/'];
var thisMatch = [ 'some', 'and', 'here'];

function matchElements(arr, arrMatch) {
    var tmpArr;
    arrMatch.forEach(function(el, i, a) {
        tmpArr = arr.filter(function(str) {
            return str.indexOf(el) !== -1;
        });
    });
    if (tmpArr.length > 1) {
        throw ("Hey, too many matches");
    } else {
        return tmpArr[0];   
    }
}

console.log(matchElements(thisArray, thisMatch));

JSFiddle:http://jsfiddle.net/Le53y7ee/

说明:

该函数遍历包含子串的数组中的每个元素,并过滤主数组,只保留匹配的字符串。循环完成后,数组应该只包含匹配所有必需子串的字符串。

答案 1 :(得分:1)

与包含所有子字符串集的字符串匹配的正则表达式如下所示:

^(?=.*?string1)(?=.*?string2)(?=.*?string3).*$

因此,您只需要将thisMatch数组转换为正则表达式。

var regexp = new RegExp('^' + thisMatch.map(function(x) {
    return '(?=.*?' + x + ')';
}).join('') + '.*$');

然后你可以找到所有匹配:

var matchingElements = thisArray.filter(function(x) {
    return regexp.test(x);
});

if (matchingElements.length != 1) {
    throw new Error('Single match not found');
} else {
    matchingElement = matchingElements[0];
}

DEMO

答案 2 :(得分:0)

从这些阵列的两个字符串中取出那些斜线。然后使用下面的arrayMatch函数,遍历索引以获得thisArray的结果,如:

function arrayMatch(yourArray, wordMatchArray){
  var ix = [], c = wordMatchArray.length;
  for(var i=0,l=yourArray.length; i<l; i++){
    var m = 0;
    for(var n=0; n<c; n++){
      if(yourArray[i].match(new RegExp(wordMatchArray[n])))m++;
      if(c === m)ix.push(i);
    }
  }
  if(!ix[0]){
    return false;
  }
  return ix;
}
var indexes = arrayMatch(thisArray, thisMatch);
for(var i=0,l=indexes.length; i<l; i++){
  var getMatch = thisArray[indexes[i]];
}

答案 3 :(得分:0)

尝试

var matchingElement = thisArray.filter(function(val, key) {
 var value = val.split(/[^a-z]/).filter(String).join(" ");
 // if `.test()` returns `true` three times at `value`
 return new RegExp(this[0]).test(value) 
        && new RegExp(this[1]).test(value) 
        && new RegExp(this[2]).test(value) 
        ? val
        : null
}.bind(thisMatch))[0].replace(/\//g,"");)

var thisArray = [ '/something_else/', '/and_something_else/', '/and_something_else_here/'];
var thisMatch = [ 'some', 'and', 'here'];

var matchingElement = thisArray.filter(function(val, key) {
 var value = val.split(/[^a-z]/).filter(String).join(" ");
 // if `.test()` returns `true` three times at `value`
 return new RegExp(this[0]).test(value) 
        && new RegExp(this[1]).test(value) 
        && new RegExp(this[2]).test(value) 
        ? val
        : null
}.bind(thisMatch))[0].replace(/\//g,"");

document.write(matchingElement)