我制作了一个正则表达式,但是无法使其顺序匹配。
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 |
|-----------------------------------------|
答案 0 :(得分:1)
您正在使用^(?=.*?CentOS)(?=.*?7)(?=.*?live)
之类的字符串创建正则表达式,该正则表达式搜索给定的单词。它没有一些限制,例如:
-
(或其他分隔符)或字符串结尾-
(或其他分隔符)之后因此,您需要像这样创建前瞻:
(?=^(.*separators)?someword(separators|$))
而不是:
(?=.*?someword)
(对于-
作为分隔符,应为:(?=^(.*[-])?someword([-]|$))
)
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", "entOS-7", "*centos*"];
jQuery.each(torrent_forbidden , function(index, torrent_forbidden) {
var regexstr = '^(?=^(.*[-])?' + torrent_forbidden.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').split(/\\?[\s,_.:*-]+/).join('([-]|$))(?=^(.*[-])?') + '([-]|$))';
console.log(regexstr)
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>
答案 1 :(得分:1)
这是一个解决方案,它可能并不完美,但是您应该更加精确地满足您的要求,在某些情况下它会失败。正则表达式将测试单词是否有序并由分隔符分隔(如果不是在开头或结尾)。它将匹配整个单词(将检测到x86
,但不会检测到x8
)。在指定的单词之间可以有单词。一些解释:
\\
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>