Java正则表达式重复捕获组

时间:2020-05-01 17:36:07

标签: java regex

考虑以下字符串:“ $ {test.one} $ {test.two}”我希望我的正则表达式返回两个匹配项,即“ test.one”和“ test.two”。为此,我有以下代码段:

导入java.util.regex.Matcher; 导入java.util.regex.Pattern;

public class RegexTester {

    private static final Pattern pattern = Pattern.compile("\\$\\{((?:(?:[A-z]+(?:\\.[A-z0-9()\\[\\]\"]+)*)+|(?:\"[\\w/?.&=_\\-]*\")+)+)}+$");

    public static void main(String[] args) {
        String testString = "${test.one}${test.two}";

        Matcher matcher = pattern.matcher(testString);

        while (matcher.find()) {
            for (int i = 0; i <= matcher.groupCount(); i++) {
                System.out.println(matcher.group(i));
            }
        }
    }
}

我还有其他一些东西,因为我希望这也可以是有效的匹配$ {test.one} $ {“ hello”}。

因此,基本上,我只希望它与$ {}内的任何内容匹配,只要它遵循以下格式:something.somethingelse(仅字母数字)或something.somethingElse()或{{1} }(字母数字加上一些其他字符)。我正在使用主要的正则表达式,或者大概是这样,但是当我运行代码时,它会发现两个组,

$ {test.two} test.two

我希望输出为

test.one test.two

2 个答案:

答案 0 :(得分:2)

基本上,您的正则表达式主要问题在于它仅在字符串的末尾匹配,并且您还匹配了更多只用[A-z]字母组成的字符。您的分组似乎也关闭了。

如果您在regex101上加载正则表达式,则您will see匹配

  • \$\{
  • (-捕获组的开始
    • (?:-一个非捕获组的开始
      • (?:[A-z]+-一个非捕获组的开始,它在Azyour first mistake)之间匹配1个以上的字符
        • (?:\.[A-z0-9()\[\]\"]+)*-重复.的0次或更多次,然后是1个以上的字母,数字,()[,{{1} },]"\^和反引号
      • _-重复非捕获组1次或更多次
      • )+-或
      • |-(?:\"[\w/?.&=_\-]*\")+,0个或多个单词,"/?.,{ {1}},&=字符,然后是_
      • --重复1次以上的组模式
    • "-非捕获组的结尾
  • )+-1个以上的)字符
  • }+-字符串的结尾。

要匹配字符串中任何出现的模式,您需要使用

}

请参见regex demo,找到匹配项后获取第1组的值。详细信息:

  • $-一个\$\{(\"[^\"]*\"|\w+(?:\(\))?(?:\.\w+(?:\(\))?)*)} 子字符串
  • \$\{-捕获组1:
    • ${-(\"[^\"]*\"|\w+(?:\(\))?(?:\.\w+(?:\(\))?)*),除了\"[^\"]*\"以外的0多个字符,然后是"
    • "-或
    • "-1个以上的字符和一个可选的|子字符串
    • \w+(?:\(\))?-()的0个或多个重复,然后是1+个单词字符和一个可选的(?:\.\w+(?:\(\))?)*子字符串
  • .-一个()字符。

请参见Java demo

}

输出:

}

答案 1 :(得分:0)

您可以使用正则表达式

(?<=\$\{")[a-z]+(?="\})|(?<=\$\{)[a-z]+\.[a-z]+(?:\(\))?(?=\})

没有捕获组。可以根据需要修改字符类[a-z],前提是它们不包含双引号,句号或右括号。

Demo

Java的正则表达式引擎执行以下操作。

(?<=\$\{")  # match '${"' in a positive lookbehind
[a-z]+      # match 1+ lowercase letters 
(?="\})     # match '"}' in a positive lookahead
|           # or 
(?<=\$\{)   # match '${' in a positive lookbehind
[a-z]+      # match 1+ lowercase letters 
\.[a-z]+    # match '.' followed by 1+ lowercase letters
(?:\(\))?   # optionally match `()`
(?=\})      # match '}' in a positive lookahead