繁体   English   中英

如何使正则表达式匹配一个单词以外的所有单词?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM