我使用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