如何在最后两个下划线之间获取String

时间:2017-12-28 06:51:37

标签: java regex

我有一个字符串"abcde-abc-db-tada_x12.12_999ZZZ_121121.333"

结果为999ZZZ

我尝试过使用

private static String getValue(String myString) {

    Pattern p = Pattern.compile("_(\\d+)_1");
    Matcher m = p.matcher(myString);
    if (m.matches()) {

        System.out.println(m.group(1));  // Should print 999ZZZ

    } else {
         System.out.println("not found"); 
    }
}

5 个答案:

答案 0 :(得分:9)

如果您想继续使用基于正则表达式的方法,请使用以下模式:

.*_([^_]+)_.*

这将贪婪地消耗,包括倒数第二个。然后它将消耗并捕获9999ZZZ

代码示例:

String name = "abcde-abc-db-tada_x12.12_999ZZZ_121121.333";
Pattern p = Pattern.compile(".*_([^_]+)_.*");
Matcher m = p.matcher(name);
if (m.matches()) {

    System.out.println(m.group(1));  // Should print 999ZZZ

} else {
     System.out.println("not found"); 
}

Demo

答案 1 :(得分:5)

使用String.split?

String given = "abcde-abc-db-tada_x12.12_999ZZZ_121121.333";
String [] splitted = given.split("_");
String result = splitted[splitted.length-2];
System.out.println(result);

答案 2 :(得分:1)

split外,您还可以使用substring

String s = "abcde-abc-db-tada_x12.12_999ZZZ_121121.333";
        String ss = (s.substring(0,s.lastIndexOf("_"))).substring((s.substring(0,s.lastIndexOf("_"))).lastIndexOf("_")+1);
        System.out.println(ss);

OR,

String s = "abcde-abc-db-tada_x12.12_999ZZZ_121121.333";
        String arr[] = s.split("_");
        System.out.println(arr[arr.length-2]);

答案 3 :(得分:0)

最后两个下划线字符之间的获取文本,首先需要找到最后两个下划线字符的索引,使用lastIndexOf非常容易:

String s = "abcde-abc-db-tada_x12.12_999ZZZ_121121.333";
String r = null;
int idx1 = s.lastIndexOf('_');
if (idx1 != -1) {
    int idx2 = s.lastIndexOf('_', idx1 - 1);
    if (idx2 != -1)
        r = s.substring(idx2 + 1, idx1);
}
System.out.println(r); // prints: 999ZZZ

这比使用正则表达式的任何解决方案都要快,包括使用split

答案 4 :(得分:-1)

由于我在第一次阅读时误解了相关代码中的逻辑,同时在使用正则表达式时出现了一些很好的答案,这是我尝试使用String类中包含的一些方法(它引入了一些变量,只是为了使它更清晰易读,当然可以用更短的方式编写):

String s = "abcde-abc-db-ta__dax12.12_999ZZZ_121121.333";
int indexOfLastUnderscore = s.lastIndexOf("_");
int indexOfOneBeforeLastUnderscore = s.lastIndexOf("_", indexOfLastUnderscore - 1);
if(indexOfLastUnderscore != -1 && indexOfOneBeforeLastUnderscore != -1) {
    String sub = s.substring(indexOfOneBeforeLastUnderscore + 1, indexOfLastUnderscore);
    System.out.println(sub);
}