在JavaScript中,是否有一种方法可以针对正则表达式数组中的字符串匹配获取布尔值?
例如('if'语句表示我想要实现的内容):
var thisExpressions = [ '/something/', '/something_else/', '/and_something_else/'];
var thisString = 'else';
if (matchInArray(thisString, thisExpressions)) {
}
在JavaScript中,是否有一种方法可以针对正则表达式数组中的字符串匹配获取布尔值?
例如('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); });
Array
的filter
方法,这个方法经常很有用而且使用方式相同。 - Sanjay Manohar.every
,而不是返回数组中任何一个匹配项为true的.some
函数。 - Michael Warnervar 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)
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 */ }
test
它在提供的参数上调用toString
,对于数组来说,将调用join()
。虽然可能不建议这样做! - WickyNilliams\b
是一个单词边界,这意味着你可以在单词“roller”中匹配/\broller\b/
,但它不会匹配“rollercoaster”,然而如果你去掉尾部的\b
,那么它将匹配“rollercoaster”的第一部分。 - gdibble过滤
掉与给定正则表达式匹配
的项0
个匹配项const sampleStringData = ["frog", "pig", "tiger"];
const matches = sampleStringData.filter((animal) => /any.regex.here/.test(animal));
if (matches.length === 0) {
console.log("No matches");
}
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!!");
}
matchInArray(thisString, thisExpressions).index
- bitifetvar matchInArray = matchInArray_builder(thisExpressions);
之后加上这个:var matchInArray = matchInArray_builder(thisExpressions); var index = matchInArray(thisString, thisExpressions).index
? - Si8matchInArray()
函数返回 String.match()
的结果。因此,实际上“if”条件并不是一个布尔值,而是一个完整的结构(它会评估为 true),报告匹配的子字符串及其位置... - bitifet看这边...
function matchInArray(stringSearch, arrayExpressions){
var position = String(arrayExpressions).search(stringSearch);
var result = (position > -1) ? true : false
return result;
}
如果你有全局标志,Andersh的解决方案将无法工作。
一个真正的返回值将在未来相同的测试中切换开和关。
regexArray.some( rx => rx.test( "a" )) // true
regexArray.some( rx => rx.test( "a" )) // false
regexArray.some( rx => rx.test( "a" )) // true
(阅读此处了解详情)
这个方法可行,而且只需要一行代码:
const isMatch = regexList.map( rx => rx.source).includes( string )
.source
返回 RegExp 模式的文本字符串。
.map
返回这些字符串的数组。
.includes
返回字符串是否在数组中
(如果您需要索引,请使用 .indexOf
)
或者:
function isInsideArray( string, regexArray ){
return regexArray.map( regex => regex.source).includes( string )
}
function isInsideArray_Andersh( string, regexArray ){
return regexArray.some( rx => rx.test( string ))
}
const list_rx = [ /apple/g, /pear/g, /banana/g ],
string = "pear"
console.log( isInsideArray( string, list_rx ))
console.log( 'Andersh:', isInsideArray_Andersh( string, list_rx ))
console.log( 'Andersh (same test):', isInsideArray_Andersh( string, list_rx ))
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);
let expressions = [ '/something/', '/something_else/', '/and_something_else/'];
let str = 'else';
这里将检查以下表达式:
if( expressions.find(expression => expression.includes(str) ) ) {
}
// 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)