RegExp игнорирует открывающие символы, если следующее закрытие не найдено - PullRequest
0 голосов
/ 25 мая 2020

Есть ли способ, как RegExp игнорирует совпадение, если оно содержит определенные символы? Я осмотрелся и нашел отрицательные совпадения, которые отлично подходят для определенных случаев (?!\<). Но я не могу найти способ создать отрицательное совпадение с необязательным любым символом, пока не будет найдена следующая открывающая скобка. Прошу прощения за плохое объяснение. Вот пример, который, я думаю, имеет больше смысла.

const text = "hello <friend>. My age is < twenty <unit>.>Signature<<signature>."
const matches = text.split(/(\<(?!\<).*?\>)/g)
// ["hello ", "<friend>", ". My age is ", "< twenty <unit>", ".>Signature<", "<signature>", "."]

Проблема в "< twenty <unit>". Я действительно ищу два элемента из значения "< twenty ", "<unit>"

1 Ответ

1 голос
/ 25 мая 2020

делает отрицательный просмотр вперед (?!) частью совпадения .. /(<((?!<)[^>])*>)/

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

Просмотр вперед работает лучше, чем просмотр назад, поскольку символ, который вам не подходит, является следующий символ, а не предыдущий.

Кроме того, замена ничего совпадающего . на [^>] = everything except closing tag предотвращает выход за пределы закрывающего тега.

Вместо просмотра вперед вы также можете перепишите его на /(<[^><]*>)/, = match everything between opening and closing tag that does not contain any tag

Я просто перечитал ваш вопрос. Если я правильно понимаю и вы хотите сопоставить и внешний тег, до начала внутреннего тега, вы можете использовать это. Соответствует открытию < + любому без тега + закрытию >, если он существует

<[^><]*>?
...