Как найти все внутри блока, кроме двух регистров

#javascript #regex

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

Вопрос:

Как захватить фрукты из следующего шаблона, учитывая, что внутри него нет манго или винограда?

ввод:

 <frutis>banana,apple,orrange,lichie</frutis>
<frutis>banana,apple,mango,lichie</frutis>
<frutis>banana,grapes,orrange,lichie</frutis>
<frutis>banana,apple,orrange,guava</frutis>
  

вывод:
банан, яблоко, апельсин, ложное

ложное
банан, яблоко, апельсин, гуава <

Я попробовал следующее :

 <frutis>([^mango|grapes]*)</frutis>
  

Ответ №1:

Вы могли бы использовать отрицательный прогноз, например, с этим регулярным выражением:

 <frutis>(?!.*mango)(?!.*grapes).*</frutis>
  

Как вы это написали, это не работает, потому что классы [.....] предназначены для сопоставления отдельных символов, а не для последовательностей. Кроме того, символ канала не имеет особого значения внутри класса, он просто означает литерал | .

Примечание: для сопоставления данных в структурах XML рекомендуется использовать не регулярные выражения, а анализатор DOM.

Ответ №2:

Попробуйте это:

 <frutis>((?:(?!mango|grapes).)*)</frutis>
  

Исходный код здесь:

 const regex = /<frutis>((?:(?!mango|grapes).)*)</frutis>/g;
const str = `<frutis>banana,apple,orrange,lichie</frutis>
<frutis>banana,apple,mango,lichie</frutis>
<frutis>banana,grapes,orrange,lichie</frutis>
<frutis>banana,apple,orrange,guava</frutis>`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex  ;
    }

    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
  

Я использовал отрицательный прогноз, чтобы определить, существуют ли эти две строки или нет.
Полное объяснение можно найти здесь