java-如何在字母和数字之间(或数字和字母之间)分割字符串?

我正在尝试找出一种在java中遵循以下模式的字符串拆分方法:

String a = "123abc345def";

结果如下:

x[0] = "123";
x[1] = "abc";
x[2] = "345";
x[3] = "def";

但是我对如何实现这一目标感到完全困惑。 有人可以帮我吗? 我尝试过在线搜索类似的问题,但是很难在搜索中正确地表达它的意思。

请注意:字母和数字的数量可能会有所不同(例如,可能会有类似“ 1234a5bcdef”的字符串)

8个解决方案

86 votes

您可以尝试拆分(?<=\d)(?=\D),例如:

str.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");

它匹配数字和非数字之间的位置(以任何顺序)。

(?<=\d)(?=\D)-匹配非数字(\D)和数字(\d)之间的位置
(?<=\d)(?=\D)-匹配数字和非数字之间的位置。
Qtax answered 2020-02-02T22:51:16Z
9 votes

怎么样:

private List Parse(String str) {
List output = new ArrayList();
Matcher match = Pattern.compile("[0-9]+|[a-z]+|[A-Z]+").matcher(str);
while (match.find()) {
output.add(match.group());
}
return output;
}
nullpotent answered 2020-02-02T22:51:36Z
7 votes

您可以尝试以下方法:

Pattern p = Pattern.compile("[a-z]+|\\d+");
Matcher m = p.matcher("123abc345def");
ArrayList allMatches = new ArrayList<>();
while (m.find()) {
allMatches.add(m.group());
}

结果(allMatches)将是:

["123", "abc", "345", "def"]
Thế Anh Nguyễn answered 2020-02-02T22:52:00Z
3 votes

使用两种不同的模式:[0-9]*和[a-zA-Z]*,并分别拆分两次。

mishadoff answered 2020-02-02T22:52:20Z
2 votes

如果您在不使用Java isNumber功能(例如splitString、ArrayList等)的情况下寻找解决方案,则以下内容应会有所帮助:

List splitString(String string) {
List list = new ArrayList();
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';
}

此解决方案将数字和“单词”分开,其中“单词”是不包含数字的字符串。 但是,如果您只希望包含英文字母的“单词”,则可以根据自己的要求通过添加更多条件(例如isNumber方法调用)轻松地对其进行修改(例如,您可能希望跳过包含非英文字母的单词)。 另请注意,splitString方法返回ArrayList,以后可以将其转换为String数组。

sergeyan answered 2020-02-02T22:52:46Z
1 votes

很久没有使用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
}
Mario answered 2020-02-02T22:53:06Z
1 votes

我正在为关键任务代码执行此类操作。 就像每一秒钟的时间一样重要,因为我需要在不明显的时间内处理180k条目。 因此,我跳过了正则表达式并完全拆分,并允许对每个元素进行内联处理(尽管将它们添加到ArrayList中就可以了)。 如果您想做这件精确的事情,但需要将其速度提高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));
}
Tatarize answered 2020-02-02T22:53:26Z
0 votes

这不是吗"d+|D+"做这项工作,而不是麻烦:"(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"?

Andrew Anderson answered 2020-02-02T22:53:46Z