2013-04-21 31 views
4

話我剛剛嘗試學習正則表達式的一個項目,我有這樣的:保持在正則表達式

patternstr = "<$Testing$>Go HERE <$Test2$>GO HERE 2 "; 
Pattern pattern = Pattern.compile("<\\$\\w+\\$>\\w+"); 
Matcher matcher = pattern.matcher(patternstr); 

它返回

<$Testing$>Go 
and 
<$Test2$>GO 

讓我怎麼獲取文本,而其餘保持兩個字符串分開?這樣應該返回

<$Testing$>Go HERE 
<$Test2$>GO HERE 2 

,如果我以後它的文本添加更多標籤,它將返回第三個以及第2

回答

3

你需要添加一個(正)前瞻,或負字符類

是這樣的:

<\\$\\w+\\$>[^<]+ 

或(編輯)

<\\$\\w+\\$>.+?(?=<) 

根據評論編輯(應該是積極的,而不是負向的超前)。

我不會重複Alan對行尾的評論,他們是對的。

+0

這第二個正則表達式是錯誤的。你希望它在**發生時停止**看到一個'<',這意味着你需要一個* positive * lookahead,而不是負數。您還需要在字符串末尾進行匹配:'<\$\w+\$>。+?(?= <| $)'。你現在擁有它的方式,在'>'之後永遠不會消耗超過一個字符。 – 2013-04-22 03:40:17

+0

嗯......當然。急速。現在編輯。謝謝 – rolfl 2013-04-22 03:45:10

0

根據您在中間碼String中允許的內容,這相當容易。

您只需重複匹配<$something$>something即可。如果你沒有<中間字符串中不那麼所有你需要做的是

final String patternstr = "<$Testing$>Go HERE <$Test2$>GO HERE 2 "; 
final Pattern pattern = Pattern.compile("<\\$([^$]++)\\$>([^<]++)"); 
final Matcher matcher = pattern.matcher(patternstr); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
} 

輸出:

Testing 
Go HERE 
Test2 
GO HERE 2 

說明:

  • <\\$相匹配的開放<$
  • ([^$]++)匹配並抓取標籤的內容,即所有內容直到th後的下一$
  • \\$>匹配收盤$>
  • ([^<]++)比賽,並抓住一切直到下一個<
相關問題