[英]How can I make a regex match all words except for one word?
我有这段文字:
<tag>Value<tag>
我想将其转换为
<%= Value %>
我能够做到,使用:
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);
但是,文本可以在文本中的任何位置包含此单词“ = \\ n”。 例如:
<tag=\n>Value<tag>
<tag>Value<tag=\n>
<tag>Value=\n<tag>
<tag>=\nValue<tag>
<tag>Va=\nlue<tag>
<ta=\ng>Value<tag>
如何修改我的模式才能正常工作?
一种简单的方法是在将字符串传递给正则表达式之前删除=\\n
:
Regex.Replace(text.Replace(@"=\n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled);
请注意,我还替换了勉强的点星号.*?
与[^<]*
可以保护您的表情免受灾难性的回溯 。
首先,您根本无法可靠,一致或通常使用正则表达式来完成您想做的事情。 有关为何不应该使用正则表达式解析SGML衍生标记语言的更多信息,请参见@bobince 关于解析(X)HTML的权威性答案
顺便说一句,这是您需要使用的正则表达式。 为什么? 因为没有用于“介于两者之间”的正则表达式运算符(据我所知,这种运算符在常规语言中是不可能的,因此您需要一个完全不同的模型来编写这样的字符串识别器)。
<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>(?<value>([^<]*))<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>
您必须稍微改变一下替换模式:
<%= ${value} %>
如果您需要删除“ = \\ n”(这似乎是您尝试处理转义的文本,那么您也永远不要这样做:无论您拥有哪种怪异的转义例程,请先对文本进行转义,然后对其进行转义,如果必要),则您将无法在同一正则表达式中执行此操作。 实际上,您可能需要遍历两次文本,一次在过程代码中获取每个值以进行清理,然后一次将值重新插入它们的适当位置。
TL; DR:如果要“将XML转换为ASP页面”(这似乎是您的目标),请使用真实的XML解析器。
尝试这个
Regex.Replace(text, "(=\\n)", "", RegexOptions.Compiled);
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.