-2

编辑:以前标记为重复。但记者似乎不明白我的问题。

我有像这样的字符串数据

Aabc123def457ghi123jkl950asd489are - has no space or character for splitting
AB950asd489are
ABC950asd489are

我想拆分——编辑不只是用一个字符或字符串拆分每个字符串,因为我需要的拆分是在字母和数字字符之间——它们变成这样的字符串数组

"Aabc123def457ghi123jkl950asd489are" => [A,abc,123,def,457,ghi,123,jkl,950,asd,489,are] (can we use String.split method? nope)
"AB950asd489are" => [AB,950,asd,489,are]
"ABC950asd489are" => [ABC,950,asd,489,are]

就像带有逗号的货币格式化程序,并将其拆分为数组一样。我需要为此找到一个正则表达式,或者有什么办法吗?

4

4 回答 4

3

这应该适合您的需求(演示):

(?<=[A-Z])(?=[^A-Z])|(?<=[a-z])(?=[^a-z])|(?<=[0-9])(?=[^0-9])

(?<=[A-Z])(?=[^A-Z])意思是“前面有一个大写字符的任何字符间,后面跟一个除大写字符外的任何字符”。

相同的逻辑适用于小写字符和数字。

于 2013-05-28T09:57:11.337 回答
0

你尝试过什么吗?

split()当字符为大写或数字时,您可以在 for 循环中使用isUpperCase(char c)and来创建字符串。Character.isDigit(char c)

于 2013-05-28T09:53:01.920 回答
0

试试这一行:

s.split("(?<![a-z])(?=[a-z])|(?<=[a-z])(?![a-z])")

以您的示例为例,它输出:

String s = "Aabc123def457ghi123jkl950asd489are";
System.out.println(Arrays.toString(s.split("(?<![a-z])(?=[a-z])|(?<=[a-z])(?![a-z])")));

[A, abc, 123, def, 457, ghi, 123, jkl, 950, asd, 489, are]

如果我两次阅读您的问题标题:

如何将字符串拆分为三个字符的数组

它可能是:

s.split("(?=[a-z]{3})|(?<=[a-z]{3})")

输出是一样的

于 2013-05-28T10:02:28.060 回答
0

Java 正则表达式代码

String regex =
       "(?<=[A-Z])(?![A-Z])|(?<=[a-z])(?![a-z])|(?<=[0-9])(?![0-9])";
System.out.println(
    Arrays.toString(
        "Aabc123def457ghi123jkl950asd489are".split(regex)));
System.out.println(
    Arrays.toString("AB950asd489are".split(regex)));
System.out.println(
    Arrays.toString("ABC950asd489are".split(regex)));

输出

[A, abc, 123, def, 457, ghi, 123, jkl, 950, asd, 489, are]
[AB, 950, asd, 489, are]
[ABC, 950, asd, 489, are]


提高性能

如果您应该在 lopp 中对许多此类输入字符串应用此正则表达式解析,则不建议使用String.split(). 为什么?因为split()即使您的正则表达式没有发生任何变化,也会在每次调用时编译正则表达式。在内部,它有点像

Pattern.compile(regex).split(strInput);

因此,为了提高我们的性能,我们可以预编译正则表达式一次,然后根据需要拆分任意多次,而不会每次都增加编译开销split()

Pattern regex = Pattern.compile(
                "(?<=[A-Z])(?![A-Z])|(?<=[a-z])(?![a-z])|(?<=[0-9])(?![0-9])");

String[] input = {"Aabc123def457ghi123jkl950asd489are",
                  "AB950asd489are", "ABC950asd489are"};

for (String strInput : input)
    System.out.println (Arrays.toString (regex.split (strInput)));
于 2013-05-28T10:14:09.877 回答