2014-10-01 89 views
1

我有這樣的文字:如何才能使正則表達式匹配除一個單詞外的所有單詞?

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

如何修改我的模式以使其工作?

+0

刪除所有'= \ n',然後使用你已有的正則表達式? – clcto 2014-10-01 20:41:56

+0

我不能這麼做,因爲= \ n除了在這個標籤內部外都是有效的<%= Value %> – nullException 2014-10-01 21:10:04

回答

1

一個簡單的出路將是你的字符串傳遞給正則表達式之前刪除=\n

Regex.Replace(text.Replace(@"=\n", ""), "<tag>([^<]*)<tag>", "<%= $1 %>", RegexOptions.Compiled); 

請注意,我也換成了捨不得點星號.*?[^<]*保護你的表情從catastrophic backtracking

+0

我無法從所有字符串中刪除= \ n。也許我可以從標籤中刪除它 – nullException 2014-10-01 22:09:59

0

試試這個

Regex.Replace(text, "(=\\n)", "", RegexOptions.Compiled); 
Regex.Replace(text, "<tag>(.*?)<tag>", "<%= $1 %>", RegexOptions.Compiled); 
1

首先,你只是你想要做的可靠,一致,或者通常使用正則表達式什麼不能做。關於爲什麼你不應該用正則表達式解析SGML派生的標記語言的更多信息,請參閱@ bobince的definitive answer on parsing (X)HTML

這樣做,這是你需要使用的正則表達式。爲什麼?因爲「穿插在」之間沒有正則表達式運算符(就我所知,這樣的運算符在普通語言中是不可能的,所以你需要一個完全不同的模型來編寫這樣的字符串識別器)。

<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?>(?<value>([^<]*))<(=\\n)?t(=\\n)?a(=\\n)?g(=\\n)?> 

你必須改變你的替代模式的位:

<%= ${value} %> 

如果您需要刪除「= \ N」(這似乎是你試圖逃脫處理文本,你應該也永遠不會這樣做:你有任何奇怪的逃避例程,避開文本,處理它,並在必要時再次轉義它),你將無法使用同一個正則表達式。事實上,您可能需要兩次通過文本,一次獲取每個值以便在程序代碼中進行消毒,然後一次在適當的位置重新插入值。

TL; DR:如果您想「將XML轉換爲ASP頁面」(這似乎是您的目標),請使用真正的XML解析器。

相關問題