繁体   English   中英

javascript - 将字符串与正则表达式数组匹配

[英]javascript - match string against the array of regular expressions

JavaScript 中是否有办法获取 Boolean 值,以将字符串与正则表达式数组匹配?

这个例子是('if'语句代表我想要实现的目标):

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = 'else';

if (matchInArray(thisString, thisExpressions)) {

} 

使用更实用的方法,您可以使用数组函数实现与单行匹配的匹配:

ECMAScript 6:

const regexList = [/apple/, /pear/];
const text = "banana pear";
const isMatch = regexList.some(rx => rx.test(text));

ECMAScript 5:

var regexList = [/apple/, /pear/];
var text = "banana pear";
var isMatch = regexList.some(function(rx) { return rx.test(text); });

http://jsfiddle.net/9nyhh/1/

var thisExpressions = [/something/, /something_else/, /and_something_else/];
var thisExpressions2 = [/else/, /something_else/, /and_something_else/];
var thisString = 'else';

function matchInArray(string, expressions) {

    var len = expressions.length,
        i = 0;

    for (; i < len; i++) {
        if (string.match(expressions[i])) {
            return true;
        }
    }

    return false;

};

setTimeout(function() {
    console.log(matchInArray(thisString, thisExpressions));
    console.log(matchInArray(thisString, thisExpressions2));
}, 200)​

您可以使用.test()在另一个字符串中找到您要查找的内容时返回一个布尔值:

var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = new RegExp('\\b' + 'else' + '\\b', 'i');
var FoundIt = thisString.test(thisExpressions);  
if (FoundIt) { /* DO STUFF */ }

这边看...

function matchInArray(stringSearch, arrayExpressions){
    var position = String(arrayExpressions).search(stringSearch);
    var result = (position > -1) ? true : false
    return result;
}

您可以将所有正则表达式合并为一个。 这样字符串只被扫描一次。 即使使用稍微复杂的正则表达式。

var thisExpressions = [ /something/, /something_else/, /and_something_else/];
var thisString = 'else';


function matchInArray(str, expr) {
    var fullExpr = new RegExp(expr
        .map(x=>x.source) // Just if you need to provide RegExp instances instead of strings or ...
        // .map(x=>x.substring(1, x.length -2)  // ...if you need to provide strings enclosed by "/" like in original question.
        .join("|")
    )
    return str.match(fullExpr);

};


if (matchInArray(thisString, thisExpressions)) {
    console.log ("Match!!");
} 

事实上,即使使用这种方法,如果您需要针对多个字符串检查相同的表达式集,这也是次优的,因为每次调用函数时您都在构建(并编译)相同的正则表达式。

更好的方法是使用这样的函数构建器:

var thisExpressions = [ /something/, /something_else/, /and_something_else/];
var thisString = 'else';

function matchInArray_builder(expr) {
    var fullExpr = new RegExp(expr
        .map(x=>x.source) // Just if you need to provide RegExp instances instead of strings or ...
        // .map(x=>x.substring(1, x.length -2)  // ...if you need to provide strings enclosed by "/" like in original question.
        .join("|")
    )   

    return function (str) {
        return str.match(fullExpr);

    };
};  

var matchInArray = matchInArray_builder(thisExpressions);

if (matchInArray(thisString)) {
    console.log ("Match!!");
} 

考虑将这个问题分成两部分:

  1. filtermatch给定正则表达式match的项目
  2. 确定过滤列表中是否有0匹配项
const sampleStringData = ["frog", "pig", "tiger"];

const matches = sampleStringData.filter((animal) => /any.regex.here/.test(animal));

if (matches.length === 0) {
  console.log("No matches");
}
let expressions = [ '/something/', '/something_else/', '/and_something_else/'];

let str = 'else';

这里将检查以下表达式:

if( expressions.find(expression => expression.includes(str) ) ) {

}

使用 Array .find() 方法遍历数组和 .include 检查子字符串

如果您有全局标志,Andersh 的解决方案将不起作用。
真正的回报将在未来相同的测试中打开和关闭。

regexArray.some(rx => rx.test("a"));    //true
regexArray.some(rx => rx.test("a"));    //false
regexArray.some(rx => rx.test("a"));    //true

在这里阅读原因)

这有效并且也是单行的:

const regexList = [/apple/, /pear/];
const text = "banana pear";
const isMatch = regexList.map(rx=>rx.source).includes(string);

.source 返回 RegExp 模式的文本。
箭头函数返回每个元素的源数组。 它们现在将是字符串。
如果字符串在数组中,则 .includes 返回(如果需要索引,请使用 .indexOf)

或者:

function isInsideArray(string, regexArray){
    return(regexArray.map(regex=>regex.source).includes(string)); 
}

如果您想使用String.match() ,如果您的数组包含匹配字符串和正则表达式,您可以这样做

let str = "The quick brown fox";
let matches = ["fox", "The.*fox", /the.*fox/i];
let strInMatches = matches.some(match => str.match(match));
console.log(strInMatches);

所以我们创建了一个函数,它接收一个字符串,以及我们想要查看的数组。 它返回一个新数组,其中包含找到的匹配项。 我们在此函数中创建一个新的 regexp 对象,然后对数组中的每个元素执行 String.search。 如果找到,它将字符串推入一个新数组并返回。

// literal_string: a regex search, like /thisword/ig
// target_arr: the array you want to search /thisword/ig for.

function arr_grep(literal_string, target_arr) {
  var match_bin = [];
  // o_regex: a new regex object.
  var o_regex = new RegExp(literal_string);
  for (var i = 0; i < target_arr.length; i++) {
    //loop through array. regex search each element.
    var test = String(target_arr[i]).search(o_regex);
    if (test > -1) {
    // if found push the element@index into our matchbin.
    match_bin.push(target_arr[i]);
    }
  }
  return match_bin;
}

// arr_grep(/.*this_word.*/ig, someArray)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM