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