Java:从具有正则表达式的字符串中提取单个匹配组

时间:2014-06-04 08:31:42

标签: java regex string string-matching

我有这种字符串:16B66C116B或222A3 * C10B 它是一个数字(带有未知数字),后跟或字母(“A”)或星号和字母(“* A”)。这种模式重复3次。

我想将此字符串拆分为:[数字,文本,数字,文本,数字,文字]

[16, B, 66, C, 116, B] 

[16, B, 66, *C, 116, B]

我写了这个:

    String tmp = "16B66C116B";
    String tmp2 = "16B66*C116B";
    String pattern = "(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})";
    boolean q = tmp.matches(pattern);
    String a[] = tmp.split(pattern);

模式匹配正确,但拆分不起作用。

(我愿意改进我的模式字符串,我认为它可以写得更好)。

2 个答案:

答案 0 :(得分:2)

您误解了拆分的功能。 Split会在给定正则表达式出现时拆分字符串,因为表达式匹配整个字符串,它返回一个空数组。

你想要的是从匹配中提取单个matching groups(括号中的东西)。为此,您必须使用PatternMatcher类。

这里有一个代码片段,可以打印出所有匹配项:

Pattern regex = Pattern.compile("(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})(\\d+)(\\D{1,2})");
Matcher matcher = regex.matcher("16B66C116B");

while (matcher.find()) {
    for (int i = 1; i <= matcher.groupCount(); ++i) {
        System.out.println(matcher.group(i));
    }
}

当然你可以改进正则表达式(就像其他用户建议的那样)

(\\d+)([A-Z]+)(\\d+)(\\*?[A-Z]+)(\\d+)([A-Z]+)

答案 1 :(得分:2)

尝试使用此模式(\\d)+|(\\D)+并使用Matcher#find()查找与模式匹配的输入序列的下一个子序列。

将所有这些内容添加到List中或最终将其转换为数组。

    String tmp = "16B66C116B";
    String tmp2 = "16B66*C116B";
    String pattern = "((\\d)+|(\\D)+)";

    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(tmp);
    while (m.find()) {
        System.out.println(m.group());
    }