如何将字符串拆分为三个字符的数组,并从字符串的结尾开始拆分

时间:2013-05-28 09:49:01

标签: javascript regex string

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

我有像

这样的字符串数据
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 个答案:

答案 0 :(得分:3)

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

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

(?<=[A-Z])(?=[^A-Z])表示“任何 inter-char 前面有一个大写的字符,后跟任何一个字符,但是一个大写字母”。

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

答案 1 :(得分:0)

你有没试过?

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

答案 2 :(得分: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})")

输出相同

答案 3 :(得分: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)));