否定Java正则表达式中的文字字符串

时间:2008-12-09 21:15:43

标签: java regex

所以正则表达式似乎与最长的匹配相匹配。例如:

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
  2. 我想要这个输出

    1. ClarkRalphKent
    2. ClarkSupermanKent
    3. 我一直在尝试以下模式:

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

      不起作用,但你看到我想说的话。我想要从Clark到Kent的字符串不包含任何Kent。

      此字符串:

      ClarkRalphKentGuyGreenGardnerBruceBatmanKent

      应生成输出

      1. ClarkRalphKent

4 个答案:

答案 0 :(得分:6)

贪婪vs不情愿是你的朋友。

尝试:Clark.+?Kent

答案 1 :(得分:4)

你想要一个“不情愿”而不是“贪婪”的量词。简单地说一个?在你的*应该做的伎俩之后。

答案 2 :(得分:3)

当您尝试"Clark[^((Kent)*)]Kent"时,我认为您需要"Clark((?!Kent).)*Kent" zero-width negative look-ahead(向下滚动一下“Look-Around Assertions”标题)。

括号指定字符匹配与模式匹配。因此,RegExp试图找到一个不在(, K, e, n, t, ), *中的单个字符。

答案 3 :(得分:2)

使用不情愿的?后缀:Clark.*?Kent 量词?*+后跟?,表示他们应该尽快停止。

请参阅 http://perldoc.perl.org/perlre.html