Регулярное выражение: поиск подстроки содержащее заданное слово с исключением при другом слове

155
26 мая 2022, 11:40

Нужно распарсить html-документ и найти все начальные теги <div>, которые содержат определенное слово, но при этом исключить строки содержащие слово исключения.
Проблема в том, что слово исключения может находится как слева, так и справа от слова поиска. А кроме этого нужно выделить подстроку из всего текста.
Я просмотрел много различных решений, но все они имеют более легкую задачу - без выделения подстрок из многострочного текста.

Как пример:

<div свойство1="значение1" свойство2="значение2" свойство3="значение3">
<div свойство2="значение2" свойство1="значение1" свойство3="значение3">
<div свойство3="значение3" свойство1="значение1">
<div свойство1="значение1" свойство3="значение3">что-то еще</div></div></div>/div>

Нужно выбрать все содержащие слово "свойство1" и не содержащие "свойство2".
Результат должен быть таким:

<div свойство3="значение3" свойство1="значение1">
<div свойство1="значение1" свойство3="значение3">

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

Answer 1

const htmlStr = `
<div свойство1="значение1" свойство2="значение2" свойство3="значение3">
<div свойство2="значение2" свойство1="значение1" свойство3="значение3">
<div свойство3="значение3" свойство1="значение1">
<div свойство1="значение1" свойство3="значение3">что-то еще</div></div></div>/div>
`;
const dom = document.createElement('html');
dom.innerHTML = htmlStr;
const res = dom.querySelectorAll('[свойство1]:not([свойство2])')
console.log([...res]);
const openTags = [...res].map(el => el.outerHTML.split('>')[0]+'>');
console.log(openTags);

Answer 2

const text = `<div свойство1="значение1" свойство2="значение2" свойство3="значение3">
<div свойство2="значение2" свойство1="значение1" свойство3="значение3">
<div свойство3="значение3" свойство1="значение1">
<div свойство1="значение1" свойство3="значение3">что-то еще</div></div></div>/div>`;
const match = text.match(/<((?!свойство2).)*?(свойство1)((?!свойство2).)*?>/g);
console.log(match);

READ ALSO
Не проходит последние тесты, задача C++

Не проходит последние тесты, задача C++

В классических ролевых играх есть 3 стандартных класса: Воин (Warrior), Маг (Mage), Вор (Rogue)Для каждого из классов важен определённый атрибут: для...

204
Не работает программа ищущая расстояние между двумя точками [закрыт]

Не работает программа ищущая расстояние между двумя точками [закрыт]

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

153
Распаковка variadic templates

Распаковка variadic templates

У меня есть шаблонная функция, которая принимает на вход параметры Args

181
Не могу понять простейший алгоритм

Не могу понять простейший алгоритм

Нужно посчитать XOR-ы всех чисел на заданном отрезкеОперация xor мне знакома, но я не знаю как посчитать xor-ы всех чисел

177