Java正则表达式一个组中的字符数决定下一个组中的字符数

Java正则表达式一个组中的字符数决定下一个组中的字符数,java,regex,conditional-statements,Java,Regex,Conditional Statements,这是给你的。是否可以根据前一组中已匹配的字符数,有条件地匹配一组中的字符数 我需要匹配这样的东西 ABCDEFG | .ABCDEF | ..ABCDE | ...ABCD | ....ABC | .....AB 我知道这可以通过多个或多个语句分别捕获每个组来实现,如下所示: [A-Z0-9]{7}|\.[A-Z0-9]{6}|\.{2}[A-Z0-9]{5} you get the idea 但这可以通过条件匹配来实现吗?(是的,我知道我只列出了字符;这是为了清楚起见,但我还

这是给你的。是否可以根据前一组中已匹配的字符数,有条件地匹配一组中的字符数

我需要匹配这样的东西

ABCDEFG | .ABCDEF | ..ABCDE | ...ABCD | ....ABC | .....AB
我知道这可以通过多个或多个语句分别捕获每个组来实现,如下所示:

[A-Z0-9]{7}|\.[A-Z0-9]{6}|\.{2}[A-Z0-9]{5}        you get the idea
但这可以通过条件匹配来实现吗?(是的,我知道我只列出了字符;这是为了清楚起见,但我还需要匹配数字,因此需要正则表达式)。我也试过这个,但不太管用

(\.*[A-Z0-9]*){7}

如果要使用单个捕获组,或许可以使用
\G
锚来断言上一次匹配结束时的位置:

(?:\.*([A-Z0-9]+)|\G(?!\A))(?:\h+\|\h+|$)
|

例如,如果您只想获取捕获组的值:

String regex = "(?:\\.*([A-Z0-9]+)|\\G(?!\\A))(?:\\h+\\|\\h+|$)";
String string = "ABCDEFG | .ABCDEF | ..ABCDE | ...ABCD | ....ABC | .....AB";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    if (matcher.group(1) != null) {
        System.out.println(matcher.group(1));
    }
}
结果:

ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB

在这种特殊情况下,可以是
((?![A-Z0-9]\)[.A-Z0-9]){7}
,以匹配[.A-Z0-9]中的7个字符序列,其中一个字符后面从不跟点