.NET正则表达式用于查找封闭文本

时间:2014-11-28 19:03:56

标签: c# .net regex

我需要用标记语法替换简单标记中包含的所有字符串。例如:我需要转换看起来像这样的字符串:

"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.Value 包含星号。

我已经确定了另一个我可以使用的正则表达式:

(?<=\*\*).+?(?=\*\*)

这会产生正确的第一场比赛,但对于后续比赛不正确;在上面的代码片段中,我得到第二个示例字符串的以下匹配序列( match.Value ):

this
 text 
needs
 to be displayed
bold

似乎是每次出现的字符串都会在星号对之间返回,而不是根据需要将它们“配对”。

如果我使用像 rubular 这样的在线正则表达式工具,我的初始解决方案似乎做了正确的事情(星号从匹配中删除),但这不是.NET实现返回的内容

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

2 个答案:

答案 0 :(得分:1)

引用替换呼叫内的捕获组。

var outputString = reg.Replace(inputString, "<bold>$1</bold>");

Ideone Demo

答案 1 :(得分:1)

有时,为了获得更多控制权,我更喜欢使用Regex.Replace使用MatchEvaluator委托的重载版{:3}}:

Regex.Replace(input,
              @"\*\*(?<a>.*?)\*\*",
              m => string.Format("<bold>{0}</bold>", m.Groups["a"].Value))

虽然这么简单的任务:

Regex.Replace(input,
              @"\*\*(?<a>.*?)\*\*", 
              @"<bold>${a}</bold>")

就足够了