2015-06-13 37 views
0

我有什麼在此代碼來修改:想獲得在Java中的正則表達式唯一正確的內容

String tags = "<div class='bat'><div id='me'>"; 
Pattern r = Pattern.compile("<(.*)>",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE | Pattern.DOTALL); 

// Now create matcher object. 
Matcher m = r.matcher(tags); 
while (m.find()) { 
    System.out.println("Found : " + m.groupCount()); 
    System.out.println(m.group()); 
} 

OUTPUT:

Found : 1 
<div class='bat'><div id='me'> 

,我想這樣的輸出:

Found: 2 
div class='bat' 
div id='me' 
+0

使用一個不情願的量詞'。*?'。 –

+1

@SotiriosDelimanolis這是相反的方法;)'*'是貪婪的,你用'?'讓它變得懶惰。順便說一句,你應該把這作爲一個答案。 –

+0

@AlexisC。哦,是的,搞砸了術語。謝謝。我不想解釋如何獲得所需輸出的其餘部分:| –

回答

0

你將需要向前看,並看看後面做到這一點

(?<=<)([^>]*)(?=>)

String tags = "<div class='bat'><div id='me'>"; 
Pattern r = Pattern.compile("(?<=<)([^>]*)(?=>)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 

輸出:

Found : 1 
div class='bat' 
Found : 1 
div id='me' 


編輯取代.*?[^>]*獲得良好的性能通過PSchemo

+1

我們可以通過'<[^>] *>'而不是'<.*?>' – Pshemo

+2

獲得更好的性能和類似的可讀性,因爲您已經在使用組,所以不需要使用環視機制。簡單的''''''''''和'matcher.group(1)'應該可以做到。 – Pshemo

+0

@Pshemo是的,它也可以這樣做,我沒有注意到。 – afzalex

0

你必須改變你的正則表達式,也可以作爲建議你的代碼添加正則表達式組inde X,像這樣:

String tags = "<div class='bat'><div id='me'>"; 
Pattern r = Pattern.compile("<(.*?)>",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE | Pattern.DOTALL); 
           ^-- use non greedy quantifier 
// Now create matcher object. 
Matcher m = r.matcher(tags); 
while (m.find()) { 
    System.out.println("Found : " + m.groupCount()); 
    System.out.println(m.group(1)); 
           ^--- use regex index 1 
} 

Working demo

Regular expression visualization

然而,上面的代碼不會給你2組,但1組匹配的2倍。如果你想有2組的內容,那麼你將不得不使用下面的代碼:

String tags = "<div class='bat'><div id='me'>"; 
Pattern r = Pattern.compile("<(.*?)><(.*?)>",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE | Pattern.DOTALL); 

// Now create matcher object. 
Matcher m = r.matcher(tags); 
if (m.find()) { 
    System.out.println("Found : " + m.groupCount()); 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

Working demo

Regular expression visualization

0

groupCount()沒有指示模式多少次匹配。它只是告訴正則表達式中有多少個捕獲組。如果groupCount()返回2,則知道訪問group(1)group(2)是安全的,但group(3)會引發異常。

while (m.find())循環內調用groupCount()是沒有意義的,因爲它永遠不會改變。它是Pattern對象的一個​​靜態屬性,因此您可以在進行第一次匹配之前調用它。當你不知道正在使用什麼正則表達式時,它纔有用,這很少見。

正如其他響應者所說,你的問題是(.*)中量詞的貪婪,解決方案是使用非貪婪變體或否定字符類。

String tags = "<div class='bat'><div id='me'>"; 

Pattern r = Pattern.compile("<([^<>]*)>"); // no modifiers needed 
Matcher m = r.matcher(tags); 
System.out.printf("Number of groups: %s%n", m.groupCount()); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

請注意,我放棄了所有的選項