2008-12-09 56 views
4

因此,正則表達式似乎匹配最長可能的匹配項。例如:否定Java正則表達式中的文字字符串

public static void main(String[] args) { 
    String s = "ClarkRalphKentGuyGreenGardnerClarkSupermanKent"; 
    Pattern p = Pattern.compile("Clark.*Kent", Pattern.CASE_INSENSITIVE); 
    Matcher myMatcher = p.matcher(s); 
    int i = 1; 
    while (myMatcher.find()) { 
     System.out.println(i++ + ". " + myMatcher.group()); 
    } 
} 

產生輸出

  1. ClarkRalphKentGuyGreenGardnerClarkSupermanKent

我想這個輸出

  1. ClarkRalphKent
  2. ClarkSupermanKent

我一直在努力模式,如:

Pattern p = Pattern.compile("Clark[^((Kent)*)]Kent", Pattern.CASE_INSENSITIVE); 

不工作,但你明白我想說什麼。我想要從克拉克到肯特的字符串,不包含任何肯特事件。

此字符串:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

應該產生輸出

  1. ClarkRalphKent

回答

6

貪婪VS捨不得這裏是你的朋友。

嘗試:Clark.+?Kent

2

使用relunctant ?後綴:Clark.*?Kent 量詞?*+可以跟?表明,他們應該儘快停止。

看到http://perldoc.perl.org/perlre.html

+0

請參閱http://perldoc.perl.org/perlre.html – 2008-12-09 21:28:41

4

你想要一個 「不情願」,而不是 「貪婪」 的量詞。簡單地把一個?你的*後應該做的伎倆。

3

當您嘗試使用"Clark[^((Kent)*)]Kent"時,我認爲您希望"Clark((?!Kent).)*Kent"zero-width negative look-ahead(向下滾動一下「Look-Around Assertions」標題)。

括號指定字符匹配與模式匹配。因此,RegExp試圖找到不在(, K, e, n, t,), *中的單個字符。

相關問題