以下内容将在_
和.
之间为我提供Pet_you.txt
会给我you
但如果我得到pet_te_you.txt
,则会获得te_you
,但我需要you
结果。如何修复我的模式以采取最后_
?
Pattern MY_PATTERN = Pattern.compile("\\_(.*?)\\.");
Matcher m = MY_PATTERN.matcher("pet_te_you.txt");
while (m.find()) {
Type = m.group(1);
System.out.println(dbType);
}
答案 0 :(得分:2)
你只需要在捕捉模式中避免使用“_”。
Pattern.compile("\\_([^_]+?)\\.")
答案 1 :(得分:2)
作为非正则表达式模式,您可以使用substring
两次 - 一次用于lastIndexOf("_")
,然后用于lastIndexOf(".")
。
s = s.substring(s.lastIndexOf("_") + 1);
s = s.substring(0, s.lastIndexOf("."));
或者以一种非丑陋的方式将它们组合起来的有趣替代方案:
s = s.substring(s.lastIndexOf("_") + 1).substring(0, s.substring(s.lastIndexOf("_") + 1).lastIndexOf("."));
或许,从String
循环遍历StringBuilder
反向(我使用lastIndexOf(".") - 1
),直到您到达非角色(或者可能是_
)
for (int i = s.lastIndexOf(".") - 1; i > 0; i--) {
if (Character.isAlphabetic(s.charAt(i))) {
sb.append(s.charAt(i));
} else {
break;
}
}
这是online示例。
*这绝对是丑陋的
答案 2 :(得分:1)
使用lastIndexOf
的相同实现String text = "pet_te_you.txt";
System.out.println(text.substring(text.lastIndexOf("_")+1, text.lastIndexOf(".")));
答案 3 :(得分:1)
你可以匹配环顾四周:(?<=_)[^_]+(?=\.)
,是的,你也可以使用lastIndexOf
获得结果。
String as[] = {"pet_te_you.txt", "Pet_you.txt"};
Pattern p = Pattern.compile("(?<=_)[^_]+(?=\\.)");
for (String s : as) {
int beginIndex = s.lastIndexOf("_");
int endIndex = s.lastIndexOf(".");
if (beginIndex >= 0 && endIndex >= 0 && beginIndex < endIndex) {
System.out.println(s.substring(beginIndex + 1, endIndex));
}
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group());
}
}
output:
you
you
you
you