Регулярное выражение, только заменить первое вхождение тега HTML

У меня есть несколько файлов, которые имеют двойной <body> теги в них (либо нарочно, либо случайно). Я ищу, чтобы найти первое вхождение только из <body> пометить и добавить его с дополнительным кодом HTML. Но второе появление не должно быть затронуто. Я использую TextWrangler. Регулярное выражение, которое я использую сейчас, заменяет оба случая, а не только первое.

Текст:

<body someattribute=...>
existing content
<body onUnload=...>

RegEx я использую:

Find: (\<body.*\>)

Replace with: 

\n\1
appended HTML code

Текущий результат:

<body someattribute=...>
appended HTML code
existing content
<body onUnload=...>
appended HTML code

Поэтому он добавляет мой добавленный код дважды. Я просто хочу, чтобы это случилось с первым <body...> только.

1 ответ

Решение

Regex:

(?s)(<body.*?>)(.*)

Заменить:

\1\nappended content\n\2

Объяснение:

  • (?s) делает. персонаж соответствует новым строкам. Без этого. персонаж будет соответствовать всем персонажам, пока не достигнет новой строки символа.
  • (<body.*?>) Находит первое "тело" и захватывает как группу 1 (\1).
  • (.*) Находит все после первого "тела" и фиксирует как группу 2 (\2).
  • Заменяет все, что было найдено с группой 1 + новая строка + добавленный контент + новая строка + группа 2

Протестировано в Notepad++

Другие вопросы по тегам