[英]RegEx to replace text between dollar signs
我想使用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之前需要进行URL编码。
请问您能使用RegEx(或其他方式)告诉我如何做到这一点吗?
这是一个适合您的示例方法。 请注意,通过使用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次或更多次。 还可以对匹配的字符进行分组,以便以后引用它们。 \\$
- 匹配结束$
您可能希望使用Regex.Replace
的重载, 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之外,你永远不能将$
用于其他任何事情。 如果你在输入文本中的某个地方有未闭合的$
,结果将会变得混乱。
一般的正则表达式是
var s = Regex.Replace("test $blabla$! It worked", @"\$.*?\$", "123");
s
将成为"test 123! It worked"
其他答案可以做一个简单的替换,但他们不会抓住组,并将其放在您的替代品中。
所以,从@ Donut的Reg Ex开始,只需稍加改动即可添加一个捕获组
\\$([^\\$]*)\\$
另一个变化是调用Regex.Match,因此你可以使用Match .Captures获取$
里面的文本。 然后,您可以在其上运行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);
既然您确切地知道文本现在是什么,那么您可以对此实例进行正常替换,然后循环以查找其余匹配项
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.