Java模式在`ABC`中找到两组两个字母

我有一个这样定义的模式:

private static final Pattern PATTERN = Pattern.compile("[a-zA-Z]{2}"); 

在我的代码中,我这样做:

  Matcher matcher = PATTERN.matcher(myString); 

并使用while循环查找所有匹配项。

  while (matcher.find()){ //do something here } 

如果myString12345AB3CD45 ,匹配器会找到两组两个字母( ABCD )。 问题是我有时myString12345ABC356所以我希望匹配器找到,首先是AB ,然后是BC (只找到`AB)。

我做错了还是正则表达式错了或匹配器不能这样工作?

放置在组0(整个比赛)中的文本片段不能在下一场比赛中重复使用,成为组0的一部分。

 12345ABC356 ^^ - AB was placed in standard match (group 0) ^^ - B can't be reused here as part of standard match 

您可以使用预览等周边机制解决此问题,这种机制不会消耗匹配的部分(它们是零长度),但您可以将其内容放在您将能够访问的单独捕获组中。

所以你的代码看起来像

 private static final Pattern PATTERN = Pattern.compile("[a-zA-Z](?=([a-zA-Z]))"); // ^^^^^^^^ ^^^^^^^^^^ // group 0 group 1 //... Matcher matcher = PATTERN.matcher(myString); while (matcher.find()){ String match = matcher.group() + matcher.group(1); //... } 

你不能用正则表达式多次匹配相同的位置,但你可以使用技巧。

为此,您需要将模式包含在前瞻和捕获组中:

(?=([A-Za-z]{2})) ,因为前瞻不匹配任何字符而只消耗一个位置。

您要查找的结果位于捕获组1中。