【问题标题】:Java Regex amount of characters in one group determines the number of characters in next groupJava Regex 一组中的字符数确定下一组中的字符数
【发布时间】:2019-12-03 21:21:48
【问题描述】:

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

我需要匹配这样的东西

ABCDEFG | .ABCDEF | ..ABCDE | ...ABCD | ....ABC | .....AB

我知道这可以通过多个 OR 语句单独捕获每个组来完成,如下所示:

[A-Z0-9]{7}|\.[A-Z0-9]{6}|\.{2}[A-Z0-9]{5}        you get the idea

但这可以通过条件匹配来完成吗? (是的,我知道我只列出了字符;这是为了清楚起见,但我也需要匹配数字,因此需要匹配正则表达式)。也试过这个,但效果不太好。

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

【问题讨论】:

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

标签: java regex conditional-statements


【解决方案1】:

如果您想使用单个捕获组,也许您可​​以使用\G 锚来断言上一场比赛结束时的位置:

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

Regex demo | Java demo

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多