首页 > 解决方案 > 如何在正则表达式或操作中获取内部组

问题描述

我试图解决一个正则表达式问题,但没有得到解决方案。

String sample1 = "Hello234Water";

String sample2 = "Hello254World";


String pat1 = "Hello(\\d+)World";

String pat2 = "Hello(\\d+)Water";


String pat = "(Hello(\\d+)World|Hello(\\d+)Water)";

Pattern p = Pattern.compile(pat, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(sample1);
if (m.find()) {
    String int1 = m.group(1);
    System.out.print(int1);

}

预期的反应234,但得到Hello234Water


编辑1:

我试图解决一个正则表达式问题,但没有得到解决方案。

    String sample1 = "Hot234Water";

    String sample2 = "Hello254World";


    String pat1 = "Hello(\\d+)World";

    String pat2 = "Hot(\\d+)Water";


    String pat = "(Hello(\\d+)World|Hot(\\d+)Water)";

    Pattern p = Pattern.compile(pat, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(sample1);
    if (m.find()) {
        String int1 = m.group(1);
        System.out.print(int1);

    }

预期响应234但得到Hot234Water

标签: javaregex

解决方案


您有不必要的组,还需要在正确的位置使用交替:

String pat = "Hello(\\d+)(?:World|Water)";

Pattern p = Pattern.compile(pat, Pattern.CASE_INSENSITIVE);

此外,您不需要DOTALL模式,因为您没有使用.(DOT) 跨换行符匹配任何内容。

fyi(?:...)称为非捕获组。


对于您编辑的问题,您可以使用此正则表达式:

final String pat = "^(?=Hello\\d+World$|Hot\\d+Water$)\\D+(\\d+)";

正则表达式演示


推荐阅读