使用正则表达式从Java中的匹配字符串中提取组

时间:2019-06-13 11:07:31

标签: java regex

我有一个包含以下值的String列表:

String [] arr = {"${US.IDX_CA}", "${UK.IDX_IO}", "${NZ.IDX_BO}", "${JP.IDX_TK}", "${US.IDX_MT}", "more-elements-with-completely-different-patterns-which-is-irrelevant"};

我正在尝试从此列表中提取所有IDX_XX。因此,从上面的列表中,我应该在Java中使用正则表达式获得IDX_CA,IDX_IO,IDX_BO等

我写了以下代码:

Pattern pattern = Pattern.compile("(.*)IDX_(\\w{2})");
for (String s : arr){
     Matcher m = pattern.matcher(s);
      if (m.matches()){
        String extract = m.group(1);
        System.out.println(extract);
      }
}

但这不会打印任何内容。有人可以告诉我我在犯什么错误。谢谢。

1 个答案:

答案 0 :(得分:4)

使用以下修复程序:

String [] arr = {"${US.IDX_CA}", "${UK.IDX_IO}", "${NZ.IDX_BO}", "${JP.IDX_TK}", "${US.IDX_MT}", "more-elements-with-completely-different-patterns-which-is-irrelevant"};
Pattern pattern = Pattern.compile("\\bIDX_(\\w{2})\\b");
for (String s : arr){
     Matcher m = pattern.matcher(s);
      while (m.find()){
        System.out.println(m.group(0)); // Get the whole match
        System.out.println(m.group(1)); // Get the 2 chars after IDX_
      }
}

请参见Java demo,输出:

IDX_CA
CA
IDX_IO
IO
IDX_BO
BO
IDX_TK
TK
IDX_MT
MT

注释

  • 使用\bIDX_(\w{2})\b模式,该模式在单词边界之间匹配IDX_和2个单词字符,并捕获IDX_之后进入组1的2个字符
  • m.matches需要完整的字符串匹配,因此将其替换为m.find()
  • if替换为while,以防字符串中有超过1个匹配项
  • m.group(0)包含整个匹配值
  • m.group(1)包含第1组的值。