使用正则表达式分割没有空格的数字和字母组

13

如果我有一个类似于"11E12C108N"的字符串,其中包含字母组和数字组,没有分隔符空格字符,如何将它们拆分?

例如,我希望结果拆分为:

tokens[0] = "11"
tokens[1] = "E"
tokens[2] = "12"
tokens[3] = "C"
tokens[4] = "108"
tokens[5] = "N"

我现在有这个。

public static void main(String[] args) {

    String stringToSplit = "11E12C108N";

    Pattern pattern = Pattern.compile("\\d+\\D+");
    Matcher matcher = pattern.matcher(stringToSplit);

    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

这给了我:

11E
12C
108N

我能否让原始的正则表达式一次完成完整的分割?而不是必须在中间标记上再次运行正则表达式?

2个回答

14

使用以下正则表达式,并获取所有匹配项的列表。这将是您要查找的内容。

\d+|\D+

在Java中,我认为代码看起来应该是这样的:

Matcher matcher = Pattern.compile("\\d+|\\D+").matcher(theString);
while (matcher.find())
{
    // append matcher.group() to your list
}

12
你还可以在正则表达式中使用 "look around" 机制来描述你想要 split 文本的位置:
String stringToSplit = "11E12C108N";
String[] tokens = stringToSplit .split("(?<=\\d)(?=\\D)|(?=\\d)(?<=\\D)");
System.out.println(Arrays.toString(tokens));

输出:[11, E, 12, C, 108, N]

思路是在数字(\d)和非数字(\D)之间的位置进行拆分。换句话说,这是一个空位置(空字符串),它具有以下特点:

  • 在它之前有数字 (?<=\d),并且在它之后有非数字 (?=\D)

或者

  • 在它之前有非数字 (?<=\D),并且在它之后有数字 (?=\d)

关于(?<=..)(?=..)(以及其他一些)的更多信息,请参考http://www.regular-expressions.info/lookaround.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接