我需要用标记语法替换简单标记中包含的所有字符串。例如:我需要转换看起来像这样的字符串:
"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实现返回的内容
我是否可以使用正则表达式字符串来实现我之后的结果,或者我是否需要对匹配进行一些后处理?
答案 0 :(得分:1)
答案 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>")
就足够了