正则表达式从包名称中提取lang和country

时间:2012-08-21 09:40:15

标签: java regex

我使用Java 7。

我想从String中提取lang和country,它们表示包文件名或属性文件名。文件名不包含扩展名。

例如

  • 捆绑 - >空字符串或null
  • bundle_en - >烯
  • bundle_en_US - > EN_US
  • complex_bundle_name_en_US - > EN_US

我试过了,但它没有给我预期的结果。

private static void testPattern(String bundleName) {
        final Pattern pattern = Pattern.compile(".+(_[a-z]{2,3}(_[A-Z]{2,3}){0,1}){0,1}");
        final Matcher matcher = pattern.matcher(bundleName);
        if (matcher.matches()) {
            for (int i = 0; i < matcher.groupCount(); ++i) {
                System.out.println("Group " + i  + " = " + matcher.group(i));
            }
        } else {
            System.out.println("Nothing");
        }
    }

对于“bundle_en_US”它的节目:

  

组0 = bundle_fr_US   第1组=空

你能帮助我纠正我的正则表达式吗?或者这个正则表达式已经存在于java核心中?

感谢。

2 个答案:

答案 0 :(得分:2)

问题是,.+在开始时已经匹配整个序列。改为使用不情愿的量词:

.+?(_[a-z]{2,3}(_[A-Z]{2,3}){0,1}){0,1}

编辑:我会考虑最好的解决方案:

.+?(?:_([a-z]{2,3})(?:_([A-Z]{2,3}))?)?

使用非捕获组,它只捕获语言和国家/地区代码并抛出“_”。此外,您应将for条件更改为i <= matcher.groupCount(),否则您将错过最后一组。使用最后一个版本和更改的条件,你得到:

输入:bundle
输出:

Group 0 = bundle
Group 1 = null
Group 2 = null

输入:bundle_en
输出:

Group 0 = bundle_en
Group 1 = en
Group 2 = null

输入:bundle_en_US
输出:

Group 0 = bundle_en_US
Group 1 = en
Group 2 = US

答案 1 :(得分:0)

这对你有用吗?

     final Pattern pattern = Pattern.compile(".+_([a-z]{2,3}(_[A-Z]{2,3})?)?");