我有这样的文字:
<tag>Value<tag>
我希望将其转换为
<%= Value %>
我能够这样做,使用:
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);
然而,文字可能包含这个词&#34; = \ n&#34;文本中的任何地方。 例如:
<tag=\n>Value<tag>
<tag>Value<tag=\n>
<tag>Value=\n<tag>
<tag>=\nValue<tag>
<tag>Va=\nlue<tag>
<ta=\ng>Value<tag>
如何修改我的模式?
答案 0 :(得分:1)
一个简单的方法是在将字符串传递给regex之前删除=\n
:
Regex.Replace(text.Replace(@"=\n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled);
请注意,我还使用.*?
替换了不情愿的点星号[^<]*
,以保护您的表达免受catastrophic backtracking的攻击。</ p>
答案 1 :(得分:1)
首先,您无法可靠,一致地或通常使用正则表达式执行您想要执行的操作。有关为什么不应该使用正则表达式解析SGML派生标记语言的更多信息,请参阅@ bobince&#39; s definitive answer on parsing (X)HTML
除此之外,这是您需要使用的正则表达式。为什么?因为没有正则表达式运算符用于&#34;穿插在&#34; (据我所知,这样的运算符不可能用常规语言编写,所以你需要一个完全不同的模型来编写这样的字符串识别器。)
<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>(?<value>([^<]*))<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>
您必须稍微更改替换模式:
<%= ${value} %>
如果你需要删除&#34; = \ n&#34; (看起来你似乎正在尝试处理转义的文本,你也应该永远不会这样做:无论你有什么奇怪的逃避例程,都可以对文本进行处理,处理它,并在必要时再次逃避它),你不会能够在同一个正则表达式中执行此操作。实际上,您可能需要在文本中进行两次传递,一次在程序代码中获取每个值以进行清理,然后一次在适当的位置重新插入值。
TL; DR:如果您想要将XML转换为ASP页面,请使用真正的XML解析器&#34; (这似乎是你的目标)。
答案 2 :(得分:0)
试试这个
Regex.Replace(text, "(=\\n)", "", RegexOptions.Compiled);
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);