2013-10-23 47 views
2

我有2個字符串如下:狀態開始內過濾和終點

test1 = "<div>/*abc*/</div>"; 
test2 = "<div>/*abc*/Contents/*efg*/</div>"; 

我需要消除如果div只包含/*...*/所有/*...*/div將刪除。 下面是正則表達式我所做的:

Regex rx1 = new Regex(@"<div>/\*[^>]+\*/(</div>|<br/></div>|<br></div>)"); 
TemplateEditorFormatted = rx1.Replace(TemplateEditorFormatted, match => { return String.Empty; }); 

字符串test1,它返回正確的結果,其全部刪除。

但是對於test2,它也會刪除所有內容。估計結果不應該刪除任何東西。

修訂(對於學習)

測試2,如果我想要消除/ ... /而不是整個股利。正則表達式是怎樣的?

任何人都可以幫忙嗎?由於

+0

您不應在HTML上使用正則表達式。正則表達式僅適用於常規語言,HTML是上下文無關語言。它可能適用於非常小的特定示例,但不應使用它,因爲它在一般實踐中不起作用。 –

+0

[問這個人關於在HTML上使用正則表達式](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

回答

1

你最好使用排除模式斷言:

@"<div>/\*(?:.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)" 
      ^^^^^^^^^^^^^ 

感興趣的部分是(?:.(?!\*/))*

  1. (?:foo)是一個簡單的非捕獲組 —現在你可以假裝它只是(foo)
  2. .通配符並匹配任何單個字符。
  3. (?!bar)稱爲負前向斷言 —它,如果bar確實跟隨,並且是零寬度表達同時匹配它不消耗任何字符匹配。

所以,這個想法是要匹配的字符,.,不屬於其次*/,只有然後*/</div>的字符串。

+0

Ur code爲我工作,T​​HX!但如果我想選擇並刪除/*..*/只在test2中?正則表達式的樣子是什麼?意味着如果僅包含/*..*/,則它將刪除整個div,如果div包含其他字符,則僅消除/*..*/。可能做什麼? – user2909214

+0

不幸的是,這可能無法用一個正則表達式來完成。我不認爲即使C#支持可變寬度lookbehind斷言,這是你需要的。但是你可能不應該用正則表達式來做這件事。相反,建立一個循環,首先找到'

...
',然後在每個div內替換'@「/\*.*?\*/」'。 ('''使得'*'_non-greedy_。) –

1

爲什麼要一步到位呢? imho它在兩個步驟中更具可讀性:

string s1 = "<div>/*abc*/</div>"; 
string s2 = "<div>/*abc*/Contents/*efg*/</div>"; 

Regex findComments = new Regex(@"/\*.*?\*/"); 
Regex findEmptyDivs = new Regex(@"<div></div>"); 

s1 = findComments.Replace(s1, ""); 
s1 = findEmptyDivs.Replace(s1, ""); 

s2 = findComments.Replace(s2, ""); 
s2 = findEmptyDivs.Replace(s2, "");