首页 > 解决方案 > 正则表达式替换为捕获组中的字符替换

问题描述

我可以使用正则表达式获取我感兴趣的字符串,但是如何用捕获中替换的字符替换它?

我想>从任何 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("$&", ">", ""))

标签: .netregexvb.netregexp-replace

解决方案


您可以使用

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 char ( \x01) 之外的任何字符。调和的(?:(?!\1).)*? 贪婪令牌可以满足您的要求,它匹配任何字符,除了在第 1 组中捕获的值,0 次或更多次,尽可能少。

MatchEvaluator用作替换参数,您可以在其中使用 访问整个匹配值m.Value


推荐阅读