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

Java模式在'ABC'中查找两组两个字母`,java,regex,Java,Regex,我有一个定义如下的模式: private static final Pattern PATTERN = Pattern.compile("[a-zA-Z]{2}"); 在我的代码中,我这样做: Matcher matcher = PATTERN.matcher(myString); 并使用while循环查找所有匹配项 while (matcher.find()){ //do something here } 如果myString是12345AB3CD45,则匹配器正在查找这两组两

我有一个定义如下的模式:

 private static final Pattern PATTERN = Pattern.compile("[a-zA-Z]{2}");
在我的代码中,我这样做:

 Matcher matcher = PATTERN.matcher(myString);
并使用while循环查找所有匹配项

 while (matcher.find()){
 //do something here
 }
如果
myString
12345AB3CD45
,则匹配器正在查找这两组两个字母(
AB
CD
)。问题是我有时会使用
myString
作为
12345ABC356
,因此我希望匹配者先查找
AB
,然后查找
BC
(只查找'AB')


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

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

要做到这一点,您需要将模式包含在一个组和一个捕获组中:

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


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

您不能将同一位置与正则表达式多次匹配,但可以使用技巧

要做到这一点,您需要将模式包含在一个组和一个捕获组中:

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


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

您不能将同一位置与正则表达式多次匹配,但可以使用技巧

要做到这一点,您需要将模式包含在一个组和一个捕获组中:

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


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

您不能将同一位置与正则表达式多次匹配,但可以使用技巧

要做到这一点,您需要将模式包含在一个组和一个捕获组中:

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


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

放置在组0(整个匹配)中的文本片段不能在下一个匹配中重新使用,以成为组0的一部分

12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们

所以你的代码看起来像

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);
    //...
}

放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用

12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们

所以你的代码看起来像

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);
    //...
}

放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用

12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们

所以你的代码看起来像

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);
    //...
}

放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用

12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们

所以你的代码看起来像

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);
    //...
}

谢谢通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我已经设法解决了我的问题。谢谢您的解释。谢谢您的解释。谢谢您的解释。谢谢您的解释。