2016-05-23 25 views
2

我希望能夠刪除<p>標記中的所有新行的實例,但不是外部的。例如:正則表達式在一個組中捕獲

<p dir="ltr">Test<br>\nA\naa</p>\n<p dir="ltr">Bbb</p> 

這是我想出了正則表達式:

(<p[^>]*?>)(?:(.*)\n*)*(.*)(</p[^>]*?>) 

,我替換爲:

$1$2$3$4 

我希望這會工作,但(?:(.*)\n*)*似乎導致的問題。有沒有什麼辦法像這樣做重複的比賽,還有一個抓球隊?

在此先感謝!

+0

有兩個'p '標籤?你希望'\ n'分開移除它們嗎? – rock321987

+0

單獨爲'p'標記是好的。它只是我希望一舉取代'p'標籤中的所有'\ n'。我希望它可能與正則表達式沒有嵌套循環。 – Jun

+0

解析器不會更適合您的需求嗎? – Jan

回答

2

解決方案

你可以使用這個表達式(在PCRE但不是在Java中。作品對於Java版本請參考下面

(?s)(?:<p|\G(?!\A))(?:(?!<\/p>).)*?\K[\n\r]+ 

Regex Demo

Rege X擊穿

(?s) #Enable . to match newlines 

(?: 
    <p #this part is to assure that whatever we find is inside <p tag 
    | #Alternation(OR) 
    \G(?!\A) #Find the position of starting of previous match. 
) 

(?: 
    (?!<\/p>). #Till it is impossible to match </p>, match . 
)*? #Do it lazily 

\K #Whatever is matched till now discard it 

[\n\r]+ #Find \n or \r 

的Java代碼

有了一點改變,我能做到這一點在Java中

String line = "<p dir=\"ltr\">Test<br>\nA\naa</p>\nabcd\n<p dir=\"ltr\">Bbb</p>"; 
System.out.println(line.replaceAll("(?s)((?:<p|\\G(?!\\A))(?:(?!<\\/p>).)*?)[\\n\\r]+", "$1")); 

Ideone Demo

+0

聖...哇。這真是太神奇了。 – Jun

+0

該死的我的正則表達式noobness!做得好搖滾 - 我太慢了,不能成爲救世主。 – zec

+0

@Jun首先讓我在JAVA – rock321987