RegEx用于替换美元符号之间的文本

时间:2011-10-05 19:03:41

标签: c# .net regex

我想使用C#.NET替换美元符号之间的每个文本实例。例如:

Check out this TeX: $x\in\mathbb{Z}^+$. It's cool.

... ...变为

Check out this TeX: <img src="http://chart.googleapis.com/chart?cht=tx&chl=x\in\mathbb{Z}^%2B" alt="x\in\mathbb{Z}^+" />. It's cool.

请注意,公式在传递到Google Charts API之前需要进行网址编码。

请问您能使用RegEx(或其他方式)告诉我如何做到这一点吗?

4 个答案:

答案 0 :(得分:5)

这是一个适合您的示例方法。请注意,通过使用Regex.Matches方法,该方法可以同时处理多个匹配:

public static string AddImgTags(string input)
{
   string pattern = @"\$([^\$]*)\$";

   foreach (Match match in Regex.Matches(input, pattern))
   {
      input = input.Replace(match.Value, 
         string.Format("<img src=\"http://chart.googleapis.com/chart?cht=tx&chl={0}\" alt=\"{0}\" />", 
         HttpUtility.UrlEncode(match.Value)));
   }

   return input;
}

模式的解释(“\$[^\$]*\$”)如下:

  • \$ - 匹配开头$
  • ([^\$]*) - 匹配除$以外的任何字符,重复0次或更多次。同时对匹配的字符进行分组,以便以后引用它们。
  • \$ - 匹配结尾$

答案 1 :(得分:2)

您可能希望使用Regex.Replace的重载,它接受计算替换的委托:

private string GetCodeForTex(Match match)
{
    string tex = match.Groups[1].Value;
    return string.Format(
        "<img src=\"{0}\" alt=\"{1}\" />", GetEscapedUrlForTex(tex), tex);
}

…

Regex.Replace(textWithDollars, @"\$([^\$]*)\$", GetCodeForTex);

GetCodeForTex中的代码可能有所不同(您可能会想到更好的名称),但我相信您会明白这一点。

另外,请注意使用这样的正则表达式进行简单的解析。这意味着除了封闭TeX之外,你永远不能将$用于其他任何事情。如果你在输入文本中的某个地方有未闭合的$,那么结果将会很糟糕。

答案 2 :(得分:1)

一般的正则表达式是

 var s = Regex.Replace("test $blabla$! It worked", @"\$.*?\$", "123");

s将成为"test 123! It worked"

答案 3 :(得分:0)

其他答案会做一个简单的替换,但是他们不会抓住该组,并将其放在替换中。

所以,从@ Donut的Reg Ex开始,只需稍加改动即可添加一个捕获组

\$([^\$]*)\$

另一个变化是调用Regex.Match,因此您可以使用Match抓取$内的文本。捕获。然后,您可以在其上运行URL编码以构建替换文本。

类似的东西:

var urlTemplate = "<img src="http://chart.googleapis.com/chart?cht=tx&chl={0}" alt="{1}" />";
var matchText = match.Captures[0].Value;

var url = string.Format(urlTemplate, UrlEncode(matchText), matchText);

由于你确切知道现在的文本是什么,你可以只为这个实例做一个正常的替换,然后循环找到其余的匹配