我使用Java 7。

我想从代表捆绑文件名或属性文件名的String中提取lang和国家。文件名不包含扩展名。

例如


bundle->空字符串或null
bundle_en-> zh
bundle_zh_CN-> zh_CN
complex_bundle_name_zh_CN-> zh_CN


我试过了,但是没有得到预期的结果。

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_zh_CN”,其显示为:


  组0 = bundle_fr_US
  组1 =空


您可以帮助我更正我的正则表达式,还是该正则表达式已经存在于Java核心中?

谢谢。

最佳答案

问题是imo开头的.+已经与整个序列匹配。改用勉强的量词:

.+?(_[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

07-24 14:43