1

我使用 Java 7。

我想从代表捆绑文件名或属性文件名的字符串中提取语言和国家/地区。文件名不包含扩展名。

例如

  • bundle --> 空字符串或 null
  • bundle_en --> zh
  • 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 = null

你能帮我纠正我的正则表达式,还是这个正则表达式已经存在于 java 核心中?

谢谢。

4

2 回答 2

2

问题是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
于 2012-08-21T10:04:11.963 回答
0

这对你有用吗?

     final Pattern pattern = Pattern.compile(".+_([a-z]{2,3}(_[A-Z]{2,3})?)?");
于 2012-08-21T09:45:46.150 回答