2010-06-13 30 views
0

尋找適合以下條件的正則表達式:需要使用正則表達式清理格式不正確的標籤

我需要清理自由流動文本中的某些標籤。例如,在文本中我有兩個重要的標籤:<2004:04:12><name of person>。不幸的是,一些標籤缺少「<」或「>」分隔符。

例如,一些如下:

1) <2004:04:12 , I need this to be <2004:04:12> 
2) 2004:04:12>, I need this to be <2004:04:12> 
3) <John Doe , I need this to be <John Doe> 

我嘗試使用下面的情況1:

String regex = "<\\d{4}-\\d{2}-\\d{2}\\w*{2}[^>]"; 
String output = content.replaceAll(regex,"$0>"); 

這的確發現 「< 2004:04:12」 的所有實例結果是「< 2004:04:12>」。 但是,我需要消除結束標記之前的空間。

不知道這是最好的方法。有什麼建議麼。

感謝

+0

關於情況1,在標籤中應該包含'2004:04:12'日期之後還有什麼?標籤應該是「<2004:04:12 info here>」嗎?基本上,你怎麼知道標籤應該結束? (關於情況3的同樣的問題) – 2010-06-13 23:08:37

+0

可能會出現這樣的情況,日期後跟一個字母字符,例如「<2004:04:12some text」。在這種情況下,結果應該是「<2004:04:12>某些文字」。感謝您的觀察。 – Brian 2010-06-13 23:19:33

+0

你怎麼知道什麼屬於一個名稱,什麼不是? – Tomalak 2010-06-13 23:26:37

回答

0

基本上,你正在尋找一個負先行,如:

String regex = "<\\d{4}-\\d{2}-\\d{2}(?!>)"; 
String output = content.replaceAll(regex,"$0>"); 

這將用數字「標籤」的幫助,但因爲沒有正則表達式,可以智能足夠匹配一個任意的名字,你必須定義非常接近這個名字可能看起來像什麼,或者處理這樣一個事實,即對於「名稱」標籤,相同的方法是不可能的。

+0

謝謝,這解決了我的問題。 – Brian 2010-06-15 04:10:25

0

對於固定的日期,你可以匹配任何日期,以零個一個或兩個尖括號:

String regex = "(\\s?\\<?)(\\d{4}:\\d{2}:\\d{2})(\\>?\\s)"; 
String replace = " <$2> "; 

要識別的名稱,我們假設部分姓名以大寫字母,唯一的分隔符開始是一個空間。我們在開始或結束處明確地匹配角度括號,名稱前後的前後字符只應該是空格或標點符號。

String regex = "(\\<[A-Z][a-zA-Z]*(\\s[A-Z][a-zA-Z])*)(?=[\\.!?:;\\s])"; 
String replace = "$1>"; 

String regex = "(?<=[\\.!?:;\\s])([A-Z][a-zA-Z]*(\\s[A-Z][a-zA-Z]*)*)"; 
String replace = "<$1"; 
+0

這也解決了這個問題。乾杯。 – Brian 2010-06-15 04:11:00