JavaScriptで、正規表現の配列に対する文字列の一致のブール値を取得する方法はありますか?
例は次のとおりです(「if」ステートメントは、私が達成しようとしていることを表しています)。
var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = 'else';
if (matchInArray(thisString, thisExpressions)) {
}
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)
より機能的なアプローチを使用すると、 array function を使用して、ワンライナーで一致を実装できます。
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); });
。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;
}
すべての正規表現を単一の正規表現に結合できます。これにより、文字列は1回だけスキャンされます。わずかに複雑な正規表現でも。
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!!");
}
let expressions = [ '/something/', '/something_else/', '/and_something_else/'];
let str = 'else';
以下は、次の式のチェックです。
if( expressions.find(expression => expression.includes(str) ) ) {
}
array .find()メソッドを使用して配列を走査し、.includeを使用して部分文字列をチェックする