Regex заменить все в наборе тегов - PullRequest
0 голосов
/ 22 июня 2010

Мне нужно заменить все экземпляры совпадения, но только в определенных тегах.

Например, рассмотрим страницу HTML, содержащую <body>...</body>

в этих тегах, которые нужно заменитьвсе вхождения говорят:

{embed=xxx}

до

<a href="xxx">xxx</a>

Я могу сделать это для всей страницы, используя что-то вроде (попытка # 1):

match={embed=(.*?)}
replace=<a href="$1">$1</a>

но это заменяет все части страницы, даже те разделы, где я не хочу, чтобы она была заменена, в частности, заголовок.

Когда я пытаюсь добавить условия вокруг соответствия, определенного выше, как это (попытка № 2):

match=(<body.*?)(?:({embed=(.*?)})+)(.*?)(</body)
replace=$1<a href="$3">$3</a>$4$5

, если заменяет только первый элемент.

Поэтому, если бы я использовал этот пример текстовых данных для поиска:

<head>
{embed=zzz}
</head>
<body>
{embed=aaa}<br />
{embed=bbb}<br />
{embed=ccc}<br />
</body>

, я получаю:

<head>
{embed=zzz}
</head>
<body>
<a href="aaa">aaa</a>aaa<br />
{embed=bbb}<br />
{embed=ccc}<br />
</body>

В идеале я хочу получить вывод:

<head>
{embed=zzz}
</head>
<body>
<a href="aaa">aaa</a><br />
<a href="bbb">bbb</a><br />
<a href="ccc">ccc</a><br />
</body>

Я знаю, что, вероятно, слишком усложняю вещи, но регулярные выражения подобны маслу для воды моего мозга - они просто не смешиваются.

Ответы [ 2 ]

0 голосов
/ 22 июня 2010

Это требует взгляда назад и вперед. Бесконечное повторение работает только для .net BTW. Попробуйте использовать это:

match=(?<=<body[^>]*>.*){embed=(.*?)}(?=.*</body>)

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

0 голосов
/ 22 июня 2010

Метод .NET, который вы ищете, это System.Text.Regular Expressions.Regex.Replace(InputString, ReplacementString)

Это заменит все совпадения шаблона во входной строке на строку замены Regex.

Пример использования:

Dim regex As New System.Text.Regular Expressions.Regex("(<body.*?)(?:({embed=(.*?)})+)(.*?)(</body)")
Dim newString = regex.Replace(inputString, "$1<a href=""$3"">$3</a>$4$5")

Документация здесь .

(Извините за пример Visual Basic. Это только то, что приходит на ум, когда упоминается .NET.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...