Регулярное выражение, чтобы получить все между фигурными скобками и включая их, только если задано условие

#javascript #regex #regular-language

Вопрос:

Здравствуйте, я пытаюсь создать регулярное выражение, которое будет захватывать все между фигурными скобками и включая их, только если строка между фигурными скобками начинается с # и если после закрывающей фигурной скобки есть n }

У меня есть следующая строка в качестве примера —

 ## Markdown Syntax {#markdown-syntax}nn (lorem ipsum test).nn## Headers {#headers}nn function HelloCodeTitle(props) {return <h1>Hello, {props.name}</h1>; } {2}
 

В этом примере я хочу извлечь {#markdown-syntax} и {#headers} из приведенной выше строки и заменить их пустым пространством ''

Я написал это регулярное выражение, но это тоже захватывает {return <h1>Hello, {props.name} , и {2} я этого не хочу. Я только хочу захватить {#markdown-syntax} и {#headers} (включая фигурные скобки), так как строка между фигурными скобками начинается с#, а после закрывающей фигурной скобки стоит n }

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

1. n является ли символ новой строки символом или за ним следует n ?

2. Это фактическое «n» в строке

Ответ №1:

Используйте match() с соответствующим рисунком:

 var input = "## Markdown Syntax {#markdown-syntax}nn (lorem ipsum test).nn## Headers {#headers}nn function HelloCodeTitle(props) {return <h1>Hello, {props.name}</h1>; } {2}";
var tags = input.match(/{#.*?}(?=n)/g, input);
console.log(tags); 

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

 {      match opening {
#       match #
.*?     match all content up the first
}      closing }
(?=n)  assert that what follows is a newline character
 

Если вы хотите удалить эти теги, используйте replace их с тем же шаблоном:

 var input = "## Markdown Syntax {#markdown-syntax}nn (lorem ipsum test).nn## Headers {#headers}nn function HelloCodeTitle(props) {return <h1>Hello, {props.name}</h1>; } {2}";
var output = input.replace(/s*{#.*?}(?=n)/g, " ").trim();
console.log(output); 

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

1. Забыл упомянуть, что я ищу замену «{#markdown-синтаксис}», «{#заголовки}» пустым местом в строке. Возможно ли это ?

2. Эй, только один короткий вопрос. Можно ли захватить только последний? Например, если я хочу просто захватить {#headers} единственный. То есть последний после того, как вы найдете совпадение?

3. Используйте этот шаблон: s*{#.*?}(?=n)(?!.*{#.*}n) … добавьте отрицательный внешний вид, чтобы убедиться, что это последнее совпадение.

4. спасибо, но тянется снова, так как у меня есть это выражение , и я ищу, чтобы получить последнее вхождение заданного состояния(. я.е я ищу, чтобы захватить {#headers} простыми словами, регулярное выражение, которое будет захватывать последнего вхождения все, что находится между и включая фигурные скобки, только если строка в фигурных скобках начинается с # и если есть N после закрытия фигурной скобки }