首页 > 解决方案 > 按顺序匹配字符串

问题描述

我做了一个正则表达式,但我不能让它按顺序匹配。

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     |
|-----------------------------------------|

标签: javascriptjqueryregex

解决方案


这是一个解决方案,它可能并不完美,但您应该更精确地满足您的要求,因为它在某些情况下会失败。正则表达式将测试单词是否按顺序排列并由分隔符分隔(如果不是在开头或结尾)。它将匹配整个单词(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>


推荐阅读