模式匹配获取角色的lastindex

时间:2018-01-25 11:20:28

标签: java

以下内容将在_.之间为我提供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);
}

4 个答案:

答案 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