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

时间:2015-01-14 09:51:16

标签: java 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"之后得到这个数字。但在它之后可能还有其他的词。

4 个答案:

答案 0 :(得分:0)

使用String.split,正则表达式指定了各部分之间的内容。在你的情况下,你的正则表达式匹配整个字符串,所以没有别的,因此它什么都不返回。

如果您想匹配此正则表达式,请使用:

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

答案 1 :(得分:0)

如果您希望String#split()为您处理模式/匹配器,您可以使用:

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]
);

答案 2 :(得分:0)

为此,最好使用PatternMatcher API。

如果您必须仅使用String#split,这纯粹来自学术目的。您可以将此基于lookbehind的正则表达式用于split

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

<强>代码:

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

OR

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

答案 3 :(得分:0)

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

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*$");