RegEx Заменить заменой символа в захваченной группе - PullRequest
1 голос
/ 08 мая 2020

Я могу получить интересующую меня строку с помощью регулярного выражения, но как мне заменить ее символом, замененным в захвате?

Я хочу удалить символ > из любого атрибута html или замените его на >.

Образец исходной строки

<html> 
<head></head> 
<body> 
<div  sometag="abc>def" onclick="myfn()" class='xyz'>
Dear {@CustomerName},
blah blah blah
</div></body> 
</html>

Желаемый результат

<html> 
<head></head> 
<body> 
<div  sometag="abc&gt;def" onclick="myfn()" class='xyz'>
Dear {@CustomerName},
blah blah blah
</div></body> 
</html>

Я использую следующий шаблон регулярного выражения и замену

Шаблон : \s\w+\s*=\s*(['"])[^\1]+?\1

Замена : -- don't know! what should I use? --

Это мой код vb.net (на всякий случай, если поможет)

Dim reAttr As New Regex("\s\w+\s*=\s*(['""])[^\1]+?\1", RegexOptions.Singleline)
result = reAttr.Replace(text, Replace("$&", ">", ""))

1 Ответ

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

Вы можете использовать

Dim reAttr As New Regex("\s\w+\s*=\s*(['""])(?:(?!\1).)*?\1", RegexOptions.Singleline)
Dim result = reAttr.Replace(text, New MatchEvaluator(Function(m As Match)
         Return m.Value.Replace(">", "-")
     End Function))

Обратите внимание, что [^\1] не выполняет то, что вы ожидаете, он соответствует любому символу, кроме символа SOH (\x01). (?:(?!\1).)*? умеренный жадный токен делает то, что вы хотели, он соответствует любому символу, кроме значения, захваченного в Группе 1, 0 или более раз, как можно меньше раз.

MatchEvaluator используется в качестве аргументов замены, где вы можете получить доступ ко всему значению соответствия с помощью m.Value.

...