如何找到字符串中第一个和第二个大写字母的索引?

时间:2021-04-04 13:53:27

标签: java

如果有 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 ** ));
        }
    }
}

2 个答案:

答案 0 :(得分:2)

String::indexOf 在这里没有太大帮助,因为它需要一个特定的值来寻找(例如,在给定的例子中,它是 str.indexOf('Y'))。因此,如果允许通过字符串中的字符进行简单的迭代,则应该这样做:

  1. 对于当前字符,检查它是否是大写字母
  2. 如果是,拾取数字直到它们结束或出现字符串结尾

更新

在对 @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>
相关问题