除了一个单词之外,我如何才能使正则表达式匹配所有单词?

时间:2014-10-01 20:34:36

标签: c# regex

我有这样的文字:

<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>

如何修改我的模式?

3 个答案:

答案 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);