如何使正则表达式匹配除一个单词外的所有单词
本文关键字:单词外 一个 单词 正则表达式 何使 | 更新日期: 2023-09-27 18:25:13
我有这样的文本:
<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>
我如何修改我的模式以工作?
一个简单的方法是在将字符串传递给regex:之前删除='n
Regex.Replace(text.Replace(@"='n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled);
注意,我还用[^<]*
替换了不情愿的星号.*?
,以保护您的表达式不受灾难性回溯的影响。
首先,您根本无法可靠地、一致地或通常使用正则表达式来完成您想要做的事情。有关为什么不应该用正则表达式解析SGML派生的标记语言的更多信息,请参阅@boince关于解析(X)HTML 的明确答案
顺便说一下,这里是您需要使用的正则表达式。为什么?因为没有regex运算符来表示"interdisplaced between"(据我所知,这样的运算符在常规语言中是不可能的,所以你需要一个完全不同的模型来编写这样的字符串识别器)。
<(=''n)?t(=''n)?a(=''n)?g(=''n)?>(?<value>([^<]*))<(=''n)?t(=''n)?a(=''n)?g(=''n)?>
你必须稍微改变一下你的替换模式:
<%= ${value} %>
如果你需要删除"=''n"(这似乎是你在试图处理转义文本,你也永远不应该这样做:无论你有什么奇怪的转义例程,都可以取消对文本的转义,处理它,并在必要时再次转义),你将无法在同一个regex中完成。事实上,您可能需要对文本进行两次遍历,一次是获取过程代码中的每个值以进行清理,然后一次是在适当的位置重新插入值。
TL;DR:如果您想"将XML转换为ASP页面"(这似乎是您的目标),请使用真正的XML解析器。
试试这个
Regex.Replace(text, "(=''n)", "", RegexOptions.Compiled);
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled);