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

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

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

… …变

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

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

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

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

 private string GetCodeForTex(Match match) { string tex = match.Groups[1].Value; return string.Format( "\"{1}\"", GetEscapedUrlForTex(tex), tex); } … Regex.Replace(textWithDollars, @"\$([^\$]*)\$", GetCodeForTex); 

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

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

这是一个适合您的示例方法。 请注意,通过使用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("\"{0}\"", HttpUtility.UrlEncode(match.Value))); } return input; } 

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

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

一般的正则表达式是

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

s将成为"test 123! It worked"

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

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

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

另一个变化是调用Regex.Match,这样你就可以使用Match .Captures获取$里面的文本。 然后,您可以在其上运行URL编码以构建替换文本。

就像是:

 var urlTemplate = "{1}"; var matchText = match.Captures[0].Value; var url = string.Format(urlTemplate, UrlEncode(matchText), matchText); 

既然您确切知道文本现在是什么,那么您可以对此实例进行正常替换,然后循环查找其余匹配项