Страницы

Поиск по вопросам

вторник, 17 марта 2020 г.

Регулярка на js “не искать внутри кавычек, но все выражение в кавычках - да”

#регулярные_выражения #javascript


Всем доброго дня! В общем, нужно найти все слова (буквы и цифры), перед которыми
стоит знак минус. Трудность в том, что если это находится где-то внутри кавычек - то
искать не надо.
Примеры. 
    -словоКотороеНайдет этоеНет -этоСноваНадет
    -"этоНайдет полностью и меня и меня"
    "-аВот я ненужен" -аЯНужен
    "и я -неНужен"    


Ответы

Ответ 1



Вот что получилось: /(^|[\s\n])-(([^\s"'][^"']*?)(?=\s)|(["'])([^\s"'][^"']*?)\4)/g Это не сработает "например -"для вот такой конструкции"" "для -этого слова" Перед выражением должен бы пробел, перевод строки или начало текста, а кавычки должны стоять прямо перед и сразу после текста. Это необходимое условие,иначе выражение, оказавшееся между двумя выражениями в кавычках, тоже будет пропускаться. По этой же причине нельзя отследить второе исключение из списка выше: @eicto, да, это пропустит, вы правы. Но отслеживать кавычки обрамлённые пробелами бессмысленно, потому как такая форма проверки отсеит и текст не заключённый в кавычки, а находящийся между двумя фразами в кавычках, потому остаётся предполагать, что кавычки стоят прямо перед текстом, или сразу после него. Так же пропустит "вот -это слово", так как ни одна кавычка не стоит рядом с ним. Если же сделать проверку на наличие кавычек более дотошной, учитывающей такой вариант, то она отсеит -это "слово". Выражение проверяет как двойные, так и одинарные кавычки. Для более тщательной проверки стоит использовать несколько последовательных обработок текста, как советует @VenZell.

Ответ 2



Updated: Второй раз переписал ответ. Отказался от написания одной универсальной регулярки, написав вместо этого несколько фильтров. Посмотреть пример Array.prototype.diff = function (a) { return this.filter(function (i) { return (a.indexOf(i) > -1) ? false : true; }); }; var string = 'неа -словоКотороеНайдет этоНет -этоСноваНадет " -это не нужно ? " -"этоНайдет полностью и меня и меня" -"-аВот я нужен" -аЯНужен "и я -неНужен" vs', badQuotes = string.match(/\-?"[^"]+"/g).diff(string.match(/\-"[^"]+"/g)), temp = ''; badQuotes.forEach(function (item) { temp = temp ? temp.replace(item, '') : string.replace(item, ''); }); var raw = temp.replace(/(\s+)/g, ' ').match(/(\-([^\-"\s]+)+|"[^"]+")/g), filtered = raw.map(function (el) { return el.replace(/^[\-"\s]?|[\-"\s]?$/g, ''); }); console.log(filtered); [ "словоКотороеНайдет", "этоСноваНадет", "этоНайдет полностью и меня и меня", "-аВот я нужен", "аЯНужен" ]

Комментариев нет:

Отправить комментарий