2008-12-09 55 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,), *中的单个字符。