2012-12-06 56 views
0

我有一句話是這樣的:正則表達式匹配這個查詢

Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/lover}.

我使用Java正EXP。這樣的(這是不工作:當然):

Pattern search = Pattern.compile("}.*{\/")

實際上,它爲我提供了這樣的輸出:

}Superman X. 123 Sr.{/hero}, the most lovable guy was hated by {lover}Louis{/

當實際上我想: 「超人X. 123老」然後是「路易」。除了運行while循環和增加索引之外,這怎麼能實現呢?我可以試試..但試圖知道是否有一個更簡單的方法,我失蹤了。

回答

1

有可能是一個更好的正則表達式,但是這確實(\{\w+\})([\w\.\s]+)(\{/\w+\})你的工作:

String test = "Well, {hero}Superman X. 123 Sr.{/hero}, the most lovable guy"+ 
        " was hated by {lover}Louis{/lover}."; 
Pattern p = Pattern.compile("(\\{\\w+\\})([\\w\\.\\s]+)(\\{/\\w+\\})"); 
Matcher m = p.matcher(test); 
while(m.find()){ 
    System.out.println(m.group(2)); 
} 
+0

'{1}'是一個無操作,浪費三個字節和整個操作。一切都默認量化爲1,因此指定1的數量是多餘的。 –

+0

@Kolink:謝謝。不知道,它沒有工作,所以我把它,但現在當我嘗試,它的工作:(。從刪除它的答案。 –

+0

對不起:當我正在瀏覽我的文檔時,我改變了一點查詢。沒有意識到你有迴應 – Knight

0

這是因爲量詞是由默認的貪婪。你想要一個懶惰的量詞,所以試試.*?而不是僅僅.*

此外,您可能要捕獲的標籤本身:

Pattern.compile("\\{([^}]+)\\}(.*?)\\{/\1\\}"); 

請注意,我不是100%確定當前的語法在Java正則表達式反向引用的,但應該工作。您應該以第一個捕獲的子模式中的標記名稱(在這種情況下爲herolover)以及第二個子模式中的名稱本身結束。