java 使用正则表达式提取第二次出现任何类型的大写字母后的所有内容

qc6wkl3g  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(161)

我需要帮助建立一个具有Java风格的正则表达式,它可以在第二次出现任何类型的大写字母后提取所有内容。
例如,对于示例字符串"98A02D1",结果应该是D1。第二个大写字母之前的字母是什么并不重要。
我想到的是:(?:.*?[A-Z]){2}(.*)
它不起作用,只能捕捉到第三次出现。降低花括号中的数字没有帮助。感谢任何帮助!

eit6fx6z

eit6fx6z1#

您可以从第二个大写字母开始匹配。或者,您可以匹配第二个大写字母之前的任何内容,并将其替换为空白。
以下正则表达式将匹配应删除的部分:

^[^A-Z]*[A-Z][^A-Z]*

正则表达式解释

  • ^:字符串的开始
  • [^A-Z]*:任意非大写字符序列
  • [A-Z]:大写字符
  • [^A-Z]*:任何非大写字符序列

在Java代码中:

String string = "98A02D1";
String pattern = "^[^A-Z]*[A-Z][^A-Z]*";

System.out.println(string.replaceFirst(pattern, ""));

输出

D1

查看正则表达式演示here和java演示here

pw136qt2

pw136qt22#

我能够使用以下内容匹配第二个事件。

(?<=[A-Z]).*?([A-Z].)
  • 第一组是正向后查找,尝试匹配任何大写字母。
  • 第二组是捕获,用于任何大写字母,后跟单个字符。
  • 两组之间是.*?模式,它将尝试匹配任何字符,0或更多。

然后可以使用以下方法返回该值。

String secondOccurrence(String string) {
    Pattern pattern = Pattern.compile("(?<=[A-Z]).*?([A-Z].)");
    Matcher matcher = pattern.matcher(string);
    if (matcher.find()) 
        return matcher.group(1);
    return null;
}

或者,您可以创建一个for循环,在找到第二个匹配项时中断。

String secondOccurrence(String string) {
    int index = 0;
    boolean first = false;
    for (char character : string.toCharArray()) {
        if (String.valueOf(character).matches("[A-Z]")) {
            if (!first) first = true;
            else break;
        }
        index++;
    }
    return string.substring(index, index + 2);
}

相关问题