Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中拆分数字和字母的字符串_Java_String_Split - Fatal编程技术网

如何在java中拆分数字和字母的字符串

如何在java中拆分数字和字母的字符串,java,string,split,Java,String,Split,测试数据包括: 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(" ");

测试数据包括:

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(" ");
但只有在两者之间有空间或任何其他标志时,它才会起作用

附言。 感谢您的回复。我检查了你的大部分答案,它们都有效。 现在的问题是哪一个是最好的?

如果您的字符串序列以数字开头,以字母结尾,那么下面的代码将起作用。
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()));
int表示,startCharIndex=-1; 对于(int i=0;i47&&asciRepresentation<58) strB.append(str.charAt(i)); 否则{ startCharIndex=i; 打破 } } System.out.println(strB.toString()); 如果(startCharIndex!=-1) System.out.println(str.substring(startCharIndex,str.length());
一个没有正则表达式的简单解决方案:
找到第一个字母的索引并在此位置拆分字符串

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"]
您可以使用正则表达式:

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...
String str=“1a、12a、1ab、12ab、123a、123abc”;
Pattern p=Pattern.compile((?\\d{1,3})(?[a-z]{1,3})”;
匹配器m=p.Matcher(str);
while(m.find()){
System.out.println(m.group(“数字”)+“/”+m.group(“字母”));
}
//输出:
//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;
}
公共数组列表拆分(字符串文本){
Pattern=Pattern.compile(“(\\d+)([a-zA-Z]+)”;
Matcher Matcher=pattern.Matcher(文本);
ArrayList结果=新建ArrayList();
if(matcher.find()&&matcher.groupCount()==2){
结果:添加(匹配组(1));
结果:添加(匹配组(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}
-从
a
z
的字符从一到三次

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

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

如果您还不太熟悉正则表达式的语法,那么您可能想看看的JavaAPI文档。这里列出了正则表达式的可用用法。值得尝试一下正则表达式,因为它可能会在将来处理字符串时节省大量时间


编辑: 实际上,此正则表达式可以更改为:


(?您的字符串将始终采用数字格式,然后是字母格式?在问题中提及给定字符串的示例输出我认为这将有助于您示例输出为1a first=1;second=a;(我将在一分钟内更新一个问题)请检查上面提到的链接,让我知道结果。你写的完全是我的解决方案,只需20分钟later@ThibautB.是的,现在当我看到你的答案,它是相似的,但写在其他“字”.无论如何,现在我改进了我的答案,以更好地满足OP的期望,现在我们的答案不是很相似。谢谢你指出,我在写我自己的答案时没有看过你的答案。谢谢你的改变,我不喜欢剽窃:p@ThibautB.在Stack Overflow或任何其他情况下,我都不会剽窃他人的答案纽约。没问题,这是个玩笑,看我最后的笑脸;)。我只是注意到你在发帖之前没有读过答案。
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