簡體   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