2016-03-09 91 views
0

現在我正試圖學習如何使用匹配器,模式和所有的東西,但我有一個問題,我無法解決它,我敢肯定,在做一些錯誤,但我不知道是什麼,所以我來這裏尋求幫助,這裏是我的代碼:匹配器只匹配第一個結果

public static void main(String[] args) { 
    Pattern pattern = Pattern.compile("effect:([^:]*)(?::([^:]*))?(\\s)"); 
    Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 "); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
    } 
} 

什麼我嘗試做,是從字符串獲得的效果和它的持續時間,但效果持續時間不是100%必需的,現在問題在於它只能檢測到第一個效果,而不是第二個效果,它會打印「健康」和「10」,它最後需要一個空格不起作用,但如果我刪除'(\\ s)',它將無法工作。

英語不是我的母語,我試圖寫這最好的我可以,如果它有任何拼寫錯誤,我道歉。

回答

2

首先,由於您似乎並不關心捕捉空間,請移除捕捉組。

其次,由於空間可能是可選的,請添加?

現在,這會造成麻煩,因爲[^:]會消耗空間,所以也會排除捕獲值的空格。

在現實中,通過這樣做,您甚至不需要在末尾處匹配空間,所以完全刪除它。

結果:

Pattern.compile("effect:([^:\\s]*)(?::([^:\\s]*))?") 

參見導致上regex101


由於正則表達式find()將剛剛跳過「壞」數據,你可能需要添加額外的保護條件,例如如果輸入是"supereffect:a:b:c:d",您是否想要匹配並返回a/b,還是應該跳過該內容?

要跳過這一點,你可以添加保護條件的話,匹配模式必須:(?=\\s|$) :在年底或用空格(?<=^|\\s)

  • 結束:

    • 在開頭或空格後開始
      Pattern.compile("(?<=^|\\s)effect:([^:\\s]*)(?::([^:\\s]*))?(?=\\s|$)") 
      
  • +0

    好了在做了一些測試之後,它可以正常工作,感謝您的幫助,感謝網頁,這非常有用。 –

    +0

    @MaTaMoR_我喜歡regex101,因爲漂亮的顏色編碼和正確的解釋,但請注意,它不支持Java正則表達式。要獲得完整的Java正則表達式支持,您需要使用[regexplanet](http://www.regexplanet.com/advanced/java/index.html) – Andreas

    +0

    嘿,對不起,因爲我們有另一個問題,我試圖獲得說明了,我希望它是這樣的: 「介紹:增刊花花公子,第二行,」 我不知道是否有可能做這樣的 「介紹:增刊花花公子,二線 反正第一個選項就夠了,問題是我不知道我到底要做什麼,現在我得到這個代碼 Pattern.compile(「description:([^ :,] *)」);但是,這將停止在第一個逗號,所以我想知道,我怎麼能讓它繼續前進到最後一個逗號? –

    0

    你的這個表達式出來:

    effect:(\w+):(\d+) 
    

    你可以簡單地用發現一個\w+字和與\d一個數字。你想捕捉什麼,讓我們插入()之間。詳細的描述是在這裏:Regex101

    在Java中它是這樣的:

    Pattern pattern = Pattern.compile("effect:(\\w+):(\\d+)"); 
    Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 "); 
    while (matcher.find()) { 
        System.out.println(matcher.group(1) + ": " + matcher.group(2)); 
    } 
    

    這裏是輸出:

    health: 10 
    speed: 15 
    
    +0

    它的工作原理,我試過類似的東西,但有點不同,生病接受你的答案儘快。 編輯:我忘了一些東西,時間是可選的,但是如果沒有它,它就無法工作,我該如何解決這個問題? –

    +0

    什麼時間?我不明白什麼是行不通的。 –

    0

    我想你正在尋找類似的東西:

    final Pattern pattern = Pattern.compile("effect:([^\\s$:]+):?(\\d*)"); 
    final Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 effect:none:"); 
    while (matcher.find()) { 
        System.out.println(matcher.group(1) + ": [" + matcher.group(2) + "]"); 
    } 
    

    輸出:

    health: [10] 
    speed: [15] 
    none: [] 
    
    +0

    它有工作時,有simecolon,但例如,如果我試着'效果:速度'它不起作用,有沒有辦法解決這個問題? –

    +0

    @MaTaMoR_是的,我已經更新了正則表達式 –

    相關問題