如何创建动态RegEx

时间:2018-12-27 10:41:58

标签: javascript jquery regex

我正在尝试匹配字符串中的某些单词。但是我没有预定义的单词数。

例如,我在Ubuntu 18 10中搜索ubuntu-18.10-desktop-amd64.iso.torrent会返回true。

或者我可以在centos 7中搜索CentOS-7-x86_64-LiveGNOME-1804.torrent也会返回true。

我不需要检查它是否是小写字母。

我尝试过的事情:

$.get('interdit', function(data) {
    var lines = data.split("\n");
    $.each(lines, function(n, data_interdit) {
        var url_check = $('textarea#url').val()
        var split_forbidden = data_interdit.split(/[\s|,|_|.|-|:]+/);
        var exist = 0;
        $.each(split_forbidden, function(n, data) {
            var n = url_check.search("^("+ data +")");
            if(n != -1){
                exist = 1
            }else{
                exist = 0
            }
            console.log('Forbidden: '+ data + ' Result: ' + n);
        })
        if(exist == 1){
            console.log('found')
        }
    });
});

文件 interdit 的示例数据:

CentOS.7
Ubuntu-18

2 个答案:

答案 0 :(得分:1)

您想在输入字符串中查找现有单词,而不考虑顺序。为此,您需要使用正向前行:

var search = 'Ubuntu 18 10';
var str = 'ubuntu-18.10-desktop-amd64.iso.torrent';
var re = new RegExp('^(?=.*' + search.split(/[\s,_.:-]+/).join(')(?=.*') + ')', 'i')

console.log(re.test(str));

这将产生如下正则表达式(设置i标志):

^(?=.*Ubuntu)(?=.*18)(?=.*10)

答案 1 :(得分:1)

RegEx阵列

更新

  

“代码给我一个错误jsbin.com/pecoleweyi/2/edit?js,console

尽管该问题未包括不太可能的输入,例如:*centos 7*,但添加以下行来转义输入中出现的特殊字符:

var esc = word.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&');

并更改下一行:

var sub = esc.replace(/\s/gi, '.');

下面的演示将:

  • 接受要搜索的字符串(str)和要在字符串中查找的字符串数组(tgt

  • .map()数组(tgt),它将在每个字符串(word)上运行一个函数

  • 转义任何特殊字符:

    var esc = word.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&');
    
  • 用点(/\s/g)替换任何空格(.):

    var sub = esc.replace(/\s/g, '.');
    
  • 然后创建一个RegExp()对象,以便可以通过模板文字插值(例如快十倍)在模式中插入变量:

    var rgx = new RegExp(`${sub}`, `gim`);
    
  • 使用.test()来获取布尔值:found = true / not found = false

    var bool = rgx.test(str);
    
  • 创建一个对象,以分配搜索字符串:word作为属性,并分配布尔值:bool作为其值。

    var obj = {
      [word]: bool
    };
    
  • 返回一个对象数组:

    [{"centos 7":true},{"Ubuntu 18 10":true}]
    

演示

var str = `ubuntu-18.10-desktop-amd64.iso.torrent 
CentOS-7-x86_64-LiveGNOME-1804.torrent`;

var tgt = [`centos 7`, `Ubuntu 18 10`, `corn flakes`, `gnome`, `Red Hat`, `*centos 7*`];

function rgxArray(str, tgt) {
  var res = tgt.map(function(word) {
    var esc = word.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&');
    var sub = esc.replace(/\s/gi, '.');
    var rgx = new RegExp(`${sub}`, `gi`);
    var bool = rgx.test(str);
    var obj = {
      [word]: bool
    };
    return obj;
  });
  return res;
}

console.log(JSON.stringify(rgxArray(str, tgt)));