如果有 string s
的输入。我想遍历整个字符串并将字符串分成更小的字符串,字符串以大写字母开头并以整数结尾。
例如,如果 string s = "X32Y"
----> 子字符串将是 X32
和 'Y'。我发现它第一次遇到大写字母 int a
,但我一直在想如何找到下一个大写字母,例如 Y
。我目前使用 a+1
,它将结束设置为第一次遇到大写的 +1
。这将导致 X3
而不是 X32
。有人可以帮忙找到找到下一个大写的方法吗? "AX32Y"
变成 ["A", "X32", "Y"]
。请忽略 "A1"
。评论,这是不必要的,"A"
是我想要的。
public String Password(String s) {
for (int i = 0; i < s.length(); i++) {
if (Character.isUpperCase(s.charAt(i))) {
int a = s.indexOf(s.charAt(i));
System.out.println(s.substring(a, ** a + 1 ** ));
}
}
}
答案 0 :(得分:2)
String::indexOf
在这里没有太大帮助,因为它需要一个特定的值来寻找(例如,在给定的例子中,它是 str.indexOf('Y')
)。因此,如果允许通过字符串中的字符进行简单的迭代,则应该这样做:
更新
在对 @Joakim Danielson's answer 的评论中进行了更新,需要为单个字母添加后缀 1
,并且正则表达式也允许使用 String::replaceAll
和前瞻(?=)
:
s = s.replaceAll("([A-Z])(?=\\D|$)", "$11");
([A-Z])
查找由单个大写字母组成的组(?=\\D|$)
...后跟非数字或字符串末尾的|$
$1
后跟 1
String s = "ABC123QX32Y24Z";
s = s.replaceAll("([A-Z])(?=\\D|$)", "$11");
System.out.println("inserted 1 between letters: " + s);
然后可以使用正则表达式将预处理过的输入有效地拆分为 LetterDigits
部分:
String[] parts = Pattern.compile("[A-Z]\\d+").matcher(s)
.results()
.map(MatchResult::group)
.toArray(String[]::new);
System.out.println("after regexp: " + Arrays.toString(parts));
输出
inserted 1 between letters: A1B1C123Q1X32Y24Z1
after regexp: [A1, B1, C123, Q1, X32, Y24, Z1]
基于迭代字符串并将各部分收集到 ArrayList
中的类似解决方案可能如下所示:
List<String> parts2 = new ArrayList<>();
String part = "";
for (int i = 0, n = s.length(); i < n; i++) {
char c = s.charAt(i);
if (Character.isLetter(c) && Character.isUpperCase(c)) {
boolean digitFound = false;
for (int j = i + 1; j < n; j++) {
char d = s.charAt(j);
if (Character.isDigit(d)) {
if (!digitFound) {
digitFound = true;
part += c;
}
part += d;
} else {
if (digitFound && part.length() > 0) {
parts2.add(part);
System.out.println(part);
}
part = "";
i = j - 1;
break;
}
}
if (part.length() > 0) {
parts2.add(part);
System.out.println(part);
part = "";
}
}
}
System.out.println("loop: " + parts2);
相同输入字符串s
的输出:
A1
B1
C123
Q1
X32
Y24
Z1
loop: [A1, B1, C123, Q1, X32, Y24, Z1]
答案 1 :(得分:1)
问题在于您试图一次完成所有工作,而没有跟踪状态(是否搜索大写)并且没有一些变量来保存您正在构建的字符串。
因为要求不是很明确,所以很难发布一个确切的答案,字符串可以包含大写字母和数字以外的其他字符,如果一行中有两个大写字母会怎样?
但只是为了向您展示这里的总体思路是一个适用于字符串“X32Y”的解决方案
<canvas id="myChart"></canvas>