javascript - 按顺序匹配字符串
问题描述
我做了一个正则表达式,但我不能让它按顺序匹配。
var $result = [];
var url_check = "CentOS-7-x86_64-LiveGNOME-1804";
var torrent_forbidden = ["CentOS-7 live", "Centos 7 livegnome", "Cent-7", "OS Cent-7", "centos:7", "centos word:7", "centos:6", "cento 7 s"];
jQuery.each(torrent_forbidden , function(index, torrent_forbidden) {
var regex = new RegExp('^(?=.*?' + torrent_forbidden.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').split(/\\?[\s,_.:*-]+/).join(')(?=.*?') + ')', 'gi');
if(regex.test(url_check) === true){
$result.push(torrent_forbidden + ' : true');
}else{
$result.push(torrent_forbidden + ' : false');
}
});
console.log($result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
这是我期望在字符串中获得的结果CentOS-7-x86_64-LiveGNOME-1804
:
|-----------------------------------------|
| Search | Result | Expected |
|-----------------------------------------|
| CentOS-7 live | true | false |
| Centos 7 livegnome | true | true |
| Cent-7 | true | false |
| OS Cent-7 | true | false |
| centos:7 | true | true |
| centos word:7 | false | false |
| centos:6 | true | false |
| cento 7 s | true | false |
|-----------------------------------------|
解决方案
这是一个解决方案,它可能并不完美,但您应该更精确地满足您的要求,因为它在某些情况下会失败。正则表达式将测试单词是否按顺序排列并由分隔符分隔(如果不是在开头或结尾)。它将匹配整个单词(x86
将被检测到但不会x8
)。在指定的那些之间可以有单词。一些解释:
- 积极的前瞻不会消耗字符,所以我认为您不能将它们组合起来以保证订单,我只会保证它们之后会出现
\\
如果从字符串构建 RegExp,则应使用双重转义- 无需使用
filter
做另一个replace
(它在重复的帖子中)-> 编辑:恢复,因为它有另一个功能:删除空字符串 - 您可以使用
?:
为不捕获的替代方案创建一个组,或者如果您想量化一个组 - 如果您对正则表达式有其他疑问,请询问..
var $result = [];
var url_check = "CentOS-7-x86_64-LiveGNOME-1804";
var torrent_forbidden = ["CentOS-7 live", "Centos 7 livegnome", "Cent-7", "OS Cent-7", "centos:7", "centos word:7", "centos:6", "cento 7 s", "CentOS x86", "CentOS x8", "*CentOS*"];
jQuery.each(torrent_forbidden , function(index, torrent_forbidden) {
var regexstr = '(?:^|[\\s,_.:*-])' + torrent_forbidden
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
.split(/\\?[\s,_.:*-]+/)
.filter( function(e){ return e.replace(/(\r\n|\n|\r)/gm,""); } )
.join('(?:(?:[\\s,_.:*-][^\\s,_.:*-]+)+)?[\\s,_.:*-]') + '(?:[\\s,_.:*-]|$)';
console.log(regexstr); //To debug your regexes
var regex = new RegExp(regexstr, 'gi');
if(regex.test(url_check) === true){
$result.push(torrent_forbidden + ' : true');
}else{
$result.push(torrent_forbidden + ' : false');
}
});
console.log($result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>