2010-06-22 5 views
0

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

Для примера рассмотрим страницу 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> 

Я знаю, что я Вероятнее всего, это усложняет ситуацию, но регулярное выражение похоже на масло моей мозговой воды - они просто не смешиваются.

ответ

0

В .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") 

Документация here.

(К сожалению о Visual Basic, например. Это именно то, что приходит на ум, когда .NET упоминается.)

+0

Благодарим за информацию. Пока я пишу свое приложение в .NET, мое приложение для проверки регулярных выражений не должно быть написано на .NET, потому что я не видел этого поведения. – NFX

0

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

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

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

+0

Это отлично работает. – NFX

Смежные вопросы