如何获取最后两个下划线之间的字符串

3

我有一个字符串"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"); 
    }
}

@Cardinal System: 更新了问题。谢谢。 - RishiKesh Pathak
5个回答

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

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

这将贪婪地匹配直到并包括倒数第二个下划线。然后它将捕获并匹配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"); 
}

演示


6

使用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);

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);

或者,

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

正则表达式的作用是提供比第一个解决方案更易读的解决方案,第二个仍然使用了正则表达式(简化版本但仍然如此),所以我会保留捕获组,主要是因为这样更安全,或者你需要先添加一些长度检查。 - AxelH
谢谢。你是对的。我只是尝试给出另一种解决方案。 - Shubhendu Pramanik
这些都是正确的,根据需要我都用过。但在第一个例子中,为了保持可读性,我不会将其写在一行上,并且在第二个例子中需要添加安全性(或者至少一个警告标志 ;) )。 - AxelH

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


-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);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接