如何将字符串分割成三个字符的数组,并且从字符串的末尾开始分割



EDIT:先前标记为重复。但是记者们似乎不明白我的问题。

我有像 这样的字符串数据
Aabc123def457ghi123jkl950asd489are - has no space or character for splitting
AB950asd489are
ABC950asd489are

和我想分割——EDIT:不仅仅是用一个字符或字符串分割每个字符串,因为我需要的分割是在alpha和数字字符之间——它们变成像这样的字符串数组

"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]

就像一个货币格式化程序,用逗号,分隔成数组。我需要找到一个正则表达式,或者有什么办法做到这一点?

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

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

(?<=[A-Z])(?=[^A-Z])表示"任何字符间以大写字符开头,后跟除大写字符外的任何字符"。

同样的逻辑也适用于小写字符和数字

你试过什么吗?

当字符是大写或数字时,您可以使用isUpperCase(char c)Character.isDigit(char c)在for循环中split()您的字符串

try this line:

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})")

输出相同

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

所以,为了提高我们的性能,我们可以预编译一次regex,然后按照我们喜欢的次数分割,而不需要在每个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)));

最新更新