2013-05-20 18 views
1

嗨我正在使用正則表達式在java中省略文本,有條件地。Java:使用正則表達式來省略文本

String pattern= "(#<omit_[a-zA-Z0-9_]+>)(.+?)(<omit_[a-zA-Z0-9_]+>)"; 

Mary had a #<omit_size>little <omit_size>lamb, his fleece was white as snow. 

我的模式在上面的例子中工作正常,找到需要隱藏(或不)。

當我可能需要隱藏某些可能也需要隱藏的內容時,出現問題。例如爲:

Mary had a #<omit_segment> #<omit_size>little <omit_size>lamb, his <omit_segment> fleece was white as snow. 

上述圖案的侷限性在於它不能其可以遵循'#<omit_'許多字符安排之間進行區分。所以,如果我只想隱藏駐留'#<omit_segment>... <omit_segment>'我的模式之間,而不是着眼於'#<omit_segment> ...#<omit_size> '和,因爲這樣會打印:

Mary had a little <omit_size>lamb, his <omit_segment> fleece was white as snow. 

,而不是所期望的:

Mary had a fleece was white as snow. 

我認識到,正則表達式可能不成爲這樣的事情的答案,但在我撤銷很多東西之前,我想我會看看是否有什麼東西可以挽救。所以..有什麼想法?

謝謝。

+0

我可以製作一個適用於這種情況的正則表達式,但是當您嵌套相同的標記時,它會失敗。對於任意嵌套,您應該使用堆棧跟蹤開始和結束標記。 – nhahtdh

回答

1
String pattern= "(#(<omit_[\\w_]+>))(.*[^#])(\\2)"; 
String pattern= "(#(<omit_[\\w_]+>))(.+)(?<!#)(\\2)"; 

\\2的第二組中,精確的標籤<...>匹配。 因此,如果嵌套時標籤名稱不同,這可能會起作用。

兩個版本都檢查結束部分是否在#之前。 在第二種情況下,反向倒序(匹配時長度爲0)。

+0

偉大的東西小夥子(喬普和拉維)。正則表達式永遠不會令我驚歎。 – HellishHeat

+0

@HellishHeat是的,沒必要放棄他們! :) –

1

你很幸運。使用反向引用來匹配正確的結尾省略關鍵字。

(#<omit_(\\w+)>)(.+)(?<!#)(<omit_\\2>) 
+0

@Downvoter,請至少先嚐試正則表達式。在我發佈之前進行了測試。如果它不符合你的要求,你可以讓我知道,我會給你寫一個新的。 –