如何在java中为数字和字母拆分String

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在java中为数字和字母拆分String相关的知识,希望对你有一定的参考价值。

测试数据例如是

1a, 12a, 1ab, 12ab, 123a, 123abc

所以如果作为输入,我们有:

String input = "1a";

输出将是

String number = "1";
String letter = "a";

就像你在这个字符串中可以注意到的那样,有时1-3个字节(0-9),有时1-3个字符串(A-Z)。

我的第一次尝试:

我试着用.substring()

但它只有在例如总是具有相同数量的数字或字母时才会起作用

我的第二次尝试是:

.split(" ");

但只有在它们之间会有空格或任何其他符号时它才会起作用。

PS。感谢您回答答案。我检查了你的大部分答案,他们都工作了。现在的问题是哪一个最好?

答案

没有正则表达式的简单解决方案:找到第一个Letter的索引并将该字符串拆分到此位置。

private String[] splitString(String s) {
  // returns an OptionalInt with the value of the index of the first Letter
  OptionalInt firstLetterIndex = IntStream.range(0, s.length())
    .filter(i -> Character.isLetter(s.charAt(i)))
    .findFirst();

  // Default if there is no letter, only numbers
  String numbers = s;
  String letters = "";
  // if there are letters, split the string at the first letter
  if(firstLetterIndex.isPresent()) {
    numbers = s.substring(0, firstLetterIndex.getAsInt());
    letters = s.substring(firstLetterIndex.getAsInt());
  }

  return new String[] {numbers, letters};
}

给你:

splitString("123abc") 
returns ["123", "abc"]

splitString("123") 
returns ["123", ""]

splitString("abc") 
returns ["", "abc"]
另一答案
If your string sequence starts with digits and ends with letters, then the below code will work.


int asciRepresentation, startCharIndex = -1;
    for(int i = 0; i < str.length(); i++) {
        asciRepresentation = (int) str.charAt(i);
        if (asciRepresentation > 47 && asciRepresentation < 58)
            strB.append(str.charAt(i));
        else {
            startCharIndex = i;
            break;
        }
    }
    System.out.println(strB.toString());
    if (startCharIndex != -1)
        System.out.println(str.substring(startCharIndex, str.length()));
另一答案

你可以使用正则表达式:

String str = "1a, 12a, 1ab, 12ab, 123a, 123abc";
Pattern p = Pattern.compile("(?<digit>\d{1,3})(?<letter>[a-z]{1,3})");
Matcher m = p.matcher(str);

while (m.find()){
    System.out.println(m.group("digit")+"/"+m.group("letter"));
}
// Ouput:
// 1/a
// 12/a
// 1/ab...
另一答案

下面你有我的建议。适用于上述测试数据

(1a,12a,1ab,12ab,123a,123abc)

解:

public ArrayList<String> split(String text) {

Pattern pattern = Pattern.compile("(\d+)([a-zA-Z]+)");
Matcher matcher = pattern.matcher(text);
ArrayList<String> result = new ArrayList<>();

if (matcher.find() && matcher.groupCount() == 2) {
  result.add(matcher.group(1));
  result.add(matcher.group(2));
}
return result;
}
另一答案

解:

(另请查看我在答案结尾处编辑的内容)

"\b(\d{1,3})([a-z]{1,3})(?=,*|\b)"

例:

String s = "1a, 12a, 1ab, 12ab, 123a, 123abc";
Pattern p = Pattern.compile("\b(\d{1,3})([a-z]{1,3})(?=,*|\b)");
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println("Group: "+ m.group() + ", letters: " + m.group(1) + ", digits: " + m.group(2));
}

你得到的输出:

Group: 1a, letters: 1, digits: a
Group: 12a, letters: 12, digits: a
Group: 1ab, letters: 1, digits: ab
Group: 12ab, letters: 12, digits: ab
Group: 123a, letters: 123, digits: a
Group: 123abc, letters: 123, digits: abc

说明:

\b(\d{1,3})([a-z]{1,3})(?=,*|\b)整个正则表达式

\b - 词边界

\d{1,3} - 数字,从一到三次

[a-z]{1,3} - 从az的人物一到三次

(?=,*|\b) - 这是积极向前看,你说在这些字母后你想要出现,或字边界,但你不希望它们出现在匹配组中(用m.group()调用)

() - 匹配组在括号中 - 在我的正则表达式中我使用了两个匹配的组:#1:(\d{1,3})#2:([a-z]{1,3})(它们用m.group(1)m.group(2)打印)

如果您还不熟悉正则表达式语法,那么您可能需要查看class Pattern的Java API文档。有一个正则表达式的可用用途列表。值得尝试使用正则表达式,因为在将来使用字符串时可能会节省大量时间。


编辑:

实际上这个正则表达式可以改为:

(?<=\b)(\d{1,3})([a-z]{1,3})(?=\b)

有一个积极的背后(?<=\b) - 这意味着你想要数字前面的单词边界(包括前瞻中的逗号和lookbehind是多余的所以我删除它)。

以上是关于如何在java中为数字和字母拆分String的主要内容,如果未能解决你的问题,请参考以下文章

java正则校验,密码必须由字母和数字组成

java正则校验,密码必须由字母和数字组成

java正则校验,密码必须由字母和数字组成

java正则校验,密码必须由字母和数字组成

java正则校验,密码必须由字母和数字组成

java正则校验,密码必须由字母和数字组成