.NET 正则表达式用于查找包含的文本
本文关键字:文本 包含 查找 正则表达式 用于 NET | 更新日期: 2023-09-27 18:32:21
我需要用标记语法替换所有出现在简单标记中的字符串。例如:我需要转换如下所示的字符串:
"this text needs to be displayed **bold**"
"**this** text **needs** to be displayed **bold**"
对这些:
"this text needs to be displayed <bold>bold</bold>"
"<bold>this</bold> text <bold>needs</bold> to be displayed <bold>bold</bold>"
如果我使用以下:
string inputString = "this text needs to be displayed **bold**";
var reg = new Regex(@"'*'*([^'*]+)'*'*");
var outputString = reg.Replace(inputString, match => "<bold>" + match.Value + "</bold>");
输出字符串如下所示:
"this text needs to be displayed <bold>**bold**</bold>"
换句话说,匹配。值包括星号。
我已经确定了另一个可以使用的正则表达式:
(?<='*'*).+?(?='*'*)
这会产生正确的第一个匹配项,但对于后续匹配项是不正确的;如上面的代码片段所示,我得到以下匹配序列(match。值)为第二个示例字符串:
this
text
needs
to be displayed
bold
它似乎返回落在星号对之间的字符串的每次出现,而不是根据需要将它们"配对"。
如果我使用像 rubular 这样的在线正则表达式工具,我的初始解决方案似乎做了正确的事情(星号从匹配项中删除),但这不是 .NET 实现返回的内容。
是否有一个正则表达式字符串可以用来实现我想要的结果,或者我是否必须对匹配进行一些后处理?
引用替换调用内的捕获组。
var outputString = reg.Replace(inputString, "<bold>$1</bold>");
Ideone 演示
有时,为了获得更多控制,我更喜欢使用使用MatchEvaluator
委托的重载版本的 Regex.Replace :
Regex.Replace(input,
@"'*'*(?<a>.*?)'*'*",
m => string.Format("<bold>{0}</bold>", m.Groups["a"].Value))
虽然对于这么简单的任务:
Regex.Replace(input,
@"'*'*(?<a>.*?)'*'*",
@"<bold>${a}</bold>")
就足够了