#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}`);
});
}
Я использовал отрицательный прогноз, чтобы определить, существуют ли эти две строки или нет.
Полное объяснение можно найти здесь