如何检查是否包含任何字符串顺序的所有关键字?正则表达式 Javascript
How to check if contains all keywords in any order of string? RegExp Javascript
我想检查一个字符串是否以任意顺序包含所有输入关键字。
在很多情况下,关键字是任意顺序的,但存在于字符串中。
示例(这是我所期望的):
// Same order and have all keywords
"Hello world!".contains( "hello world" ) // true
// Same order and have all keywords
"Hello all in the world!".contains( "hello world" ) // true
// Any order but have all keywords
"Hello world!".contains( "world hello" ) // true
// Same order and all keywords
"Hello world!".contains( "worl hell" ) // true
// Have all keywords in any order
"Hello world!".contains( "world" ) // true
// No contains all keywords
"Hello world!".contains( "where you go" ) // false
// No contains all keywords
"Hello world!".contains( "z" ) // false
// No contains all keywords
"Hello world!".contains( "z1 z2 z3" ) // false
// Contains all keywords in any order
"Hello world!".contains( "wo" ) // true
我试试:
/(?=\bhello\b)(?=\bworld\b)/i.test("hello world") // false
/(?=.*?hello.*?)(?=.*?world.*?)/i.test("hello world") // false
/^(?=\bhello\b)(?=\bworld\b).*?$/i.test("hello world") // false
我创建了一些函数,例如:
// escape string to use in regexp
String.prototype.escape = function () {
return this.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&")
};
// check if empty string
String.prototype.isEmpty = function () {
return this.length === 0;
};
// check if contain keywords...
String.prototype.contains = function (keywords) {
var value = '^(?=\b' + keywords
.escape()
.replace(/(^\s+|\s+$)/ig, '')
.replace(/\s+/, ' ')
.split(/\s+/)
.join('.*?)(?=.*?') + ').*$',
reg = new RegExp(value, 'i'),
text = this;
return reg.test( this );
};
谢谢
您的意思是关键字的无序列表:Regex - match multiple unordered words in a string,但删除了每个正则表达式标记的最后 \b
部分
/(?=.*?\bhello)(?=.*?\bworld).*/i
有了这些类型的正则表达式,您的所有测试现在都应该通过了。
中查看
i
使其忽略大小写,以防您还需要检查 Hello、wOrld 等
lookahead-based 选项的替代方案是:
String.prototype.contains = function (keywordsStr) {
var keywords = keywordsStr.split(/\s+/);
return keywords.every(function(keyword)) {
var reg = new RegExp(keyword.escape());
return reg.test(this);
}, this);
};
使用 .match() 方法进行字符串化是一种简单的方法。
你可以试试这个
示例:
var re = /(hello|world)/i;
var str = "Hello world!";
console.log('Do we found something?', Boolean(str.match(re)));
// for other
var re = /(hello|world)/i; // true
var re = /(world|hello)/i; // true
var re = /(worl|hell)/i; // true
var re = /(this|is|my|world)/i; // true
var re = /(where|you|go)/i; // false
var re = /(z)/i; // false
var re = /(z1|z2|z3)/i; // false
var re = /(wo)/i; // true
String.prototype.contains = function(string){
var keywords = string.split(" ");
var contain = true;
for(var i = 0; i < keywords.length && contain; i++){
if(keywords[i] == "") continue;
var regex = new RegExp(keywords[i], "i");
contain = contain && regex.test(this);
}
return contain;
}
的答案展示了如何构建解决 OP 问题的正则表达式。下面是演示如何动态构建此类正则表达式、传递来自 OP 的所有测试用例的工作代码。
function buildRegEx(str, keywords){
return new RegExp("(?=.*?\b" +
keywords
.split(" ")
.join(")(?=.*?\b") +
").*",
"i"
);
}
function test(str, keywords, expected){
var result = buildRegEx(str, keywords).test(str) === expected
console.log(result ? "Passed" : "Failed");
}
// Same order and have all keywords
test("Hello world!", "hello world", true);
// Same order and have all keywords
test("Hello all in the world!", "hello world", true);
// Any order but have all keywords
test("Hello world!", "world hello", true);
// Same order and all keywords
test("Hello world!", "worl hell", true);
// Have all keywords in any order
test("Hello world!", "world", true);
// No contains all keywords
test("Hello world!", "where you go", false);
// No contains all keywords
test("Hello world!", "z", false);
// No contains all keywords
test("Hello world!", "z1 z2 z3", false);
// Contains all keywords in any order
test("Hello world!", "wo", true);
result.filter(camp => search.map(keyword => camp.name.includes(keyword)).reduce((acc, curr) => acc && curr, true));
我想检查一个字符串是否以任意顺序包含所有输入关键字。 在很多情况下,关键字是任意顺序的,但存在于字符串中。
示例(这是我所期望的):
// Same order and have all keywords
"Hello world!".contains( "hello world" ) // true
// Same order and have all keywords
"Hello all in the world!".contains( "hello world" ) // true
// Any order but have all keywords
"Hello world!".contains( "world hello" ) // true
// Same order and all keywords
"Hello world!".contains( "worl hell" ) // true
// Have all keywords in any order
"Hello world!".contains( "world" ) // true
// No contains all keywords
"Hello world!".contains( "where you go" ) // false
// No contains all keywords
"Hello world!".contains( "z" ) // false
// No contains all keywords
"Hello world!".contains( "z1 z2 z3" ) // false
// Contains all keywords in any order
"Hello world!".contains( "wo" ) // true
我试试:
/(?=\bhello\b)(?=\bworld\b)/i.test("hello world") // false
/(?=.*?hello.*?)(?=.*?world.*?)/i.test("hello world") // false
/^(?=\bhello\b)(?=\bworld\b).*?$/i.test("hello world") // false
我创建了一些函数,例如:
// escape string to use in regexp
String.prototype.escape = function () {
return this.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&")
};
// check if empty string
String.prototype.isEmpty = function () {
return this.length === 0;
};
// check if contain keywords...
String.prototype.contains = function (keywords) {
var value = '^(?=\b' + keywords
.escape()
.replace(/(^\s+|\s+$)/ig, '')
.replace(/\s+/, ' ')
.split(/\s+/)
.join('.*?)(?=.*?') + ').*$',
reg = new RegExp(value, 'i'),
text = this;
return reg.test( this );
};
谢谢
您的意思是关键字的无序列表:Regex - match multiple unordered words in a string,但删除了每个正则表达式标记的最后 \b
部分
/(?=.*?\bhello)(?=.*?\bworld).*/i
有了这些类型的正则表达式,您的所有测试现在都应该通过了。
中查看i
使其忽略大小写,以防您还需要检查 Hello、wOrld 等
lookahead-based 选项的替代方案是:
String.prototype.contains = function (keywordsStr) {
var keywords = keywordsStr.split(/\s+/);
return keywords.every(function(keyword)) {
var reg = new RegExp(keyword.escape());
return reg.test(this);
}, this);
};
使用 .match() 方法进行字符串化是一种简单的方法。 你可以试试这个
示例:
var re = /(hello|world)/i;
var str = "Hello world!";
console.log('Do we found something?', Boolean(str.match(re)));
// for other
var re = /(hello|world)/i; // true
var re = /(world|hello)/i; // true
var re = /(worl|hell)/i; // true
var re = /(this|is|my|world)/i; // true
var re = /(where|you|go)/i; // false
var re = /(z)/i; // false
var re = /(z1|z2|z3)/i; // false
var re = /(wo)/i; // true
String.prototype.contains = function(string){
var keywords = string.split(" ");
var contain = true;
for(var i = 0; i < keywords.length && contain; i++){
if(keywords[i] == "") continue;
var regex = new RegExp(keywords[i], "i");
contain = contain && regex.test(this);
}
return contain;
}
function buildRegEx(str, keywords){
return new RegExp("(?=.*?\b" +
keywords
.split(" ")
.join(")(?=.*?\b") +
").*",
"i"
);
}
function test(str, keywords, expected){
var result = buildRegEx(str, keywords).test(str) === expected
console.log(result ? "Passed" : "Failed");
}
// Same order and have all keywords
test("Hello world!", "hello world", true);
// Same order and have all keywords
test("Hello all in the world!", "hello world", true);
// Any order but have all keywords
test("Hello world!", "world hello", true);
// Same order and all keywords
test("Hello world!", "worl hell", true);
// Have all keywords in any order
test("Hello world!", "world", true);
// No contains all keywords
test("Hello world!", "where you go", false);
// No contains all keywords
test("Hello world!", "z", false);
// No contains all keywords
test("Hello world!", "z1 z2 z3", false);
// Contains all keywords in any order
test("Hello world!", "wo", true);
result.filter(camp => search.map(keyword => camp.name.includes(keyword)).reduce((acc, curr) => acc && curr, true));