在标签之间查找文本并替换它以及标签。

3

我正在使用以下正则表达式模式查找 [code][/code] 标签之间的文本:

(?<=[code]).*?(?=[/code])

它会返回在这两个标签之间的任何内容,例如:[code]return Hi There;[/code] 将给我 return Hi There;

我需要帮助使用正则表达式替换整个文本以及标签。


例如,我想用其他文本替换所有出现的 ** [code] 和 [/code] ** 之间的文本。我刚刚设法让它工作 @"[code].*?[/code]... 这能进一步改进吗? - Vinay Dwivedi
这个\[code].*?\[/code]模式有什么问题? - Kirill Polishchuk
我对正则表达式不是很擅长,所以想知道是否有遗漏的地方?准确来说,使用[code].*?[/code]是否足以返回整个代码块以及标签? - Vinay Dwivedi
3个回答

7
请使用以下内容:
var s = "My temp folder is: [code]Path.GetTempPath()[/code]";

var result = Regex.Replace(s, @"\[code](.*?)\[/code]",
    m =>
        {
            var codeString = m.Groups[1].Value;

            // then evaluate this string
            return EvaluateMyCode(codeString)
        });

只有一件事,我可以使用[],但是使用<>会导致异常System.ArgumentException:解析“<code>(?)</code>”-对未定义的组名称代码的引用... - Vinay Dwivedi
@KirillPolishchuk 为什么你在这里使用了一个 lambda 表达式? - TheLukeMcCarthy
@KirillPolishchuk 对不起,我并没有说你的答案是错误的或者是一个差劲的答案。但是,Regex.Replace调用是否会替换传入字符串中匹配正则表达式的所有实例呢?我必须承认我对lambda表达式不是很熟悉。 - TheLukeMcCarthy

6
我会使用HTML解析器来完成这个任务。我可以看出你试图做的很简单,但是这些事情往往会随着时间的推移变得更加复杂。最终结果是对未来维护代码的可怜人造成了很大的痛苦。
看一下关于HTML解析器的这个问题吧。 在C#中解析HTML的最佳方法是什么? [编辑]
这里有一个更相关的答案。 @Milad Naseri 正则表达式是正确的,你只需要像这样做
string matchCodeTag = @"\[code\](.*?)\[/code\]";
string textToReplace = "[code]The Ape Men are comming[/code]";
string replaceWith = "Keep Calm";
string output = Regex.Replace(textToReplace, matchCodeTag, replaceWith);

查看以下网站获取更多示例
http://www.dotnetperls.com/regex-replace
http://oreilly.com/windows/archive/csharp-regular-expressions.html

希望这能帮助你


我同意使用解析器而不是正则表达式更好,因为在正则表达式中,括号匹配容易出错,而将 ( 替换为 [code],将 ) 替换为 [/code] 并不能改变这一点。然而,OP发布的内容不是HTML,所以我看不出HTML解析器如何帮助到这里。 - Rune FS
@Rune FS 抱歉,我在这里做了一个假设,实际上是一个相当大的假设。您考虑过使用像 Regex Buddy http://www.regexbuddy.com/ 这样的工具吗?它需要 30 欧元的费用,但物有所值。 - TheLukeMcCarthy

1
你需要使用后向引用,即将\[code\](.*?)\[/code\]替换为类似于<code>$1</code>的内容,这将提取由[code][/code]标签包装的内容,并将其包含在 -- 例如此示例中 -- <code></code>标签中。

抱歉,我可能错过了一点。[code].*?[/code]会替换字符串中的所有内容,其中可能有多个这样的标签。这些标签包含C#代码,必须执行并用其返回的字符串替换。因此,整个[Code]和[/code]内部的C#代码都必须被替换为返回值。 - Vinay Dwivedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接