.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 实现返回的内容。

是否有一个正则表达式字符串可以用来实现我想要的结果,或者我是否必须对匹配进行一些后处理?

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

就足够了