测试数据例如。
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。 感谢您回答答案。我检查了你的大部分答案,他们都工作了。 现在的问题是哪一个最好?
答案 0 :(得分:1)
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()));
答案 1 :(得分:1)
没有正则表达式的简单解决方案: 找到第一个字母的索引并将字符串拆分到此位置。
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"]
答案 2 :(得分:1)
您可以使用正则表达式:
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...
答案 3 :(得分:1)
下面你有我的建议。适用于上述测试数据
( 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;
}
答案 4 :(得分:1)
(另请参阅我在答案结尾处所做的编辑)
"\\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}
- 从a
到z
的字符数从一到三次
(?=,*|\\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)
有一个积极的lookbehind (?<=\\b)
- 这意味着你希望数字前面有单词边界(包括前瞻中的逗号和lookbehind是多余的所以我删除了它。)