我使用Java 7。
我想从String中提取lang和country,它们表示包文件名或属性文件名。文件名不包含扩展名。
例如
我试过了,但它没有给我预期的结果。
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核心中?
感谢。
答案 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})?)?");