【发布时间】:2017-02-17 09:53:36
【问题描述】:
我想通过函数标签用Regex解析下面的文本。
Anwers: <function>2+2
<function>1+3</function>
</function>.
Thanks for your time.
<function>sayGoodbye()
<function>10*10</function>
writeYourName()
</function>
下面是一个递归方法,应该将给定的文本转换为:
答案:44。 谢谢你的时间。 再见 100 条雷克斯。
private static readonly string TagFormulaStart = "<function>";
private static readonly string TagFormulaEnd = "</function>";
public static string Calculate(string formula)
{
var pattern = string.Format("{0}(((.|\r|\n)*?)){1}", TagFormulaStart, TagFormulaEnd);
var matches = Regex.Matches(formula, pattern);
if (matches.Count == 0)
{
return formula;
}
else
{
var firstAppearanceOfTAG = matches[0].ToString();
var formulaToCalculate = firstAppearanceOfTAG.Replace(TagFormulaStart, string.Empty).Replace(TagFormulaEnd, string.Empty);
var result = BgProcessorLib.Evaluator.EvaluateString(formulaToCalculate, null, false);
formula = formula.Replace(firstAppearanceOfTAG, result);
return Calculate(formula);
}
}
问题是我的正则表达式 /<function>(((.|\r|\n)*?))<\/function>/igm 在嵌套标签的情况下将在第一次出现函数结束标签时停止。
为了更清楚,我附上一张图片。
【问题讨论】:
-
如果你在 C# 中工作并使用 .NET 正则表达式,那么在只支持 JS 正则表达式的站点上测试正则表达式是没有意义的。
-
您确定要使用正则表达式解析 XML 吗?有很多现成的“轮子”,调用 XML 解析器。
-
@NikolayProkopyev 它不是 XML。
-
XML 和 HTML 不是“常规语言”(在技术意义上)。因此,一般来说,正则表达式不能处理它们(即使在它们的大规模扩展状态下,超出了正则表达式的原始概念)。请改用解析器。坚持使用正则表达式可能会有[后果[(stackoverflow.com/a/1732454/67392)。
-
@POIR:不清楚为什么输出应该有
Goodbye 100 Rex.