编辑:以前标记为重复。但记者似乎不明白我的问题。
我有像
这样的字符串数据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]
就像使用逗号,
的货币格式化程序并将其拆分为数组一样。我需要为此找到一个正则表达式,还是有办法做到这一点?
答案 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)));