所以正则表达式似乎与最长的匹配相匹配。例如:
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());
}
}
生成输出
我想要这个输出
我一直在尝试以下模式:
Pattern p = Pattern.compile("Clark[^((Kent)*)]Kent", Pattern.CASE_INSENSITIVE);
不起作用,但你看到我想说的话。我想要从Clark到Kent的字符串不包含任何Kent。
此字符串:
ClarkRalphKentGuyGreenGardnerBruceBatmanKent
应生成输出
答案 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
量词?
,*
,+
后跟?
,表示他们应该尽快停止。