通过正则表达式将字符串拆分为多个部分

split string to parts by regex

我需要通过正则表达式将字符串拆分成多个部分。 字符串是:AA2 DE3AA2 我需要这个 2.

String code = "AA2 DE3";
String[] parts = code.split("^(AA(\d)+){1}( )?(\w*)?$");

这里parts的长度是0。 我试过了

String[] parts = code.split("^((AA){1}(\d)+){1}( )?(\w*)?$");

还有 0.

它看起来像是错误的正则表达式。尽管它在 PHP.

中运行良好

编辑

事实上我需要得到"AA"后面的数字,但后面可能还有额外的单词。

对于 String.split,正则表达式指定了各部分之间的内容。在你的情况下,你的正则表达式匹配整个字符串,所以没有别的,因此它 returns 没有。

如果你想匹配这个正则表达式,使用:

Pattern pattern = Pattern.compile("^(AA(\d)+){1}( )?(\w*)?$");
Matcher matcher = pattern.matcher(code);
if(!matcher.matches()) {
    // the string doesn't match your regex; handle this

} else {
    String part1 = matcher.group(1);
    String part2 = matcher.group(2);
    // repeat the above line similarly for the third and forth groups

    // do something with part1/part2/...
}

如果您希望 String#split() 为您处理 Pattern/Matcher,您可以使用:

String[] inputs = { "AA2 DE3", "AA3", "BB45 FG6", "XYZ321" };
    try {
        for (String input : inputs) {
            System.out.println(
                    input.split(" ")[0].split("(?=\d+$)", 2)[1]
                );
        }
    } catch (ArrayIndexOutOfBoundsException e) {
        System.err.println("Input format is incorrect.");
    }
}

输出:

2
3
45
321

如果输入保证以AA开头,也可以使用

System.out.println(
    input.split(" ")[0].split("(?<=^AA)")[1]
);

为此使用 PatternMatcher API 确实更好。

这纯粹是出于学术目的,以防您必须仅使用 String#split。您可以将此基于 lookbehind 的正则表达式用于 split:

(?<=AA\d{1,999}) *

代码:

String[] toks = "AA2 DE3".split( "(?<=AA\d{1,999}) *" ); // [AA2, DE3]

String[] toks = "AA2".split( "(?<=AA\d{1,999}) *" ); // [AA2]

假设您只想提取数字而不关心验证其余部分:

Pattern pattern = Pattern.compile("^AA(\d+)");
Matcher matcher = pattern.matcher(code);

String id = null;

if (matcher.find()) {
    id = matcher.group(1);
}

请注意,我将 (\d)+ 重写为 (\d+) 以捕获所有数字。当有多个数字时,您的正则表达式仅捕获最后一个数字。

如果您想保留您的验证:

Pattern pattern = Pattern.compile("^AA(\d+) ?\w*$");