如何分割字母和数字(或数字和字母之间)的string?
我试图找出一种在Java中分割string的方式,如下所示:
String a = "123abc345def";
这个结果应该如下:
x[0] = "123"; x[1] = "abc"; x[2] = "345"; x[3] = "def";
不过,我完全难以想象如何实现这一目标。 请有人可以帮我吗? 我曾尝试在网上search类似的问题,但是在search中正确地使用它是非常困难的。
请注意:字母和数字的数量可能会有所不同(例如,可能有一个像'1234a5bcdef'这样的string)
你可以尝试分割(?<=\D)(?=\d)|(?<=\d)(?=\D)
str.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
它匹配数字和非数字之间的位置(以任何顺序)。
怎么样:
private List<String> Parse(String str) { List<String> output = new ArrayList<String>(); Matcher match = Pattern.compile("[0-9]+|[az]+|[AZ]+").matcher(str); while (match.find()) { output.add(match.group()); } return output; }
你可以试试这个:
Pattern p = Pattern.compile("[az]+|\\d+"); Matcher m = p.matcher("123abc345def"); ArrayList<String> allMatches = new ArrayList<>(); while (m.find()) { allMatches.add(m.group()); }
结果(allMatches)将是:
["123", "abc", "345", "def"]
使用两种不同的模式: [0-9]*
和[a-zA-Z]*
并分别分开两次。
如果您正在寻找解决scheme而不使用Java String
function(即split
, match
等),那么以下内容应该有所帮助:
List<String> splitString(String string) { List<String> list = new ArrayList<String>(); String token = ""; char curr; for (int e = 0; e < string.length() + 1; e++) { if (e == 0) curr = string.charAt(0); else { curr = string.charAt(--e); } if (isNumber(curr)) { while (e < string.length() && isNumber(string.charAt(e))) { token += string.charAt(e++); } list.add(token); token = ""; } else { while (e < string.length() && !isNumber(string.charAt(e))) { token += string.charAt(e++); } list.add(token); token = ""; } } return list; } boolean isNumber(char c) { return c >= '0' && c <= '9'; }
这个解决scheme将拆分数字和“单词”,其中“单词”是不包含数字的string。 但是,如果您只想包含英文字母的“单词”,则可以根据您的要求(例如,您可能希望跳过包含非英文字母的单词)添加更多条件(如isNumber
方法调用)来轻松修改它。 另请注意, splitString
方法返回ArrayList
,后者可以转换为String
数组。
没有使用Java的年龄,所以只是一些伪代码,这应该帮助你开始(比查找一切:)更快)。
string a = "123abc345def"; string[] result; while(a.Length > 0) { string part; if((part = a.Match(/\d+/)).Length) // match digits ; else if((part = a.Match(/\a+/)).Length) // match letters ; else break; // something invalid - neither digit nor letter result.append(part); a = a.SubStr(part.Length - 1); // remove the part we've found }
我正在为关键任务代码做这种事情。 就像每一秒钟的一小部分,因为我需要在一个不明显的时间处理18万个条目。 所以我跳过了正则expression式并完全拆分,并允许对每个元素进行内联处理(尽pipe将它们添加到ArrayList<String>
将会很好)。 如果你想做这个确切的事情,但需要它是20倍更快的东西…
void parseGroups(String text) { int last = 0; int state = 0; for (int i = 0, s = text.length(); i < s; i++) { switch (text.charAt(i)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (state == 2) { processElement(text.substring(last, i)); last = i; } state = 1; break; default: if (state == 1) { processElement(text.substring(last, i)); last = i; } state = 2; break; } } processElement(text.substring(last)); }