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

本文关键字:单词外 一个 单词 正则表达式 何使 | 更新日期: 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);
相关文章: