Как создать динамичный RegEx - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь сопоставить несколько слов в строке.Но у меня нет заранее определенного количества слов, которые мне нужно найти.

Например, поиск по 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 голосов
/ 27 декабря 2018

Массив 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(), чтобы получить логическое значение: найдено = true / ненайдено = 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)));
0 голосов
/ 27 декабря 2018

Вы хотите искать существующие слова во входной строке без учета порядка.Для этого вам нужно использовать позитивный взгляд:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...