有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找点扩展前最后一个下划线后的字符串

我需要在这个字符串中找到20140809T0000Z

PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc

我尝试了以下操作以将字符串保留在.nc之前:

(?<=_)(.*)(?=.nc) 

从最后一条下划线开始,我有以下内容:

/_[^_]*$/

如何使用正则表达式查找点扩展名前最后一个下划线后的字符串


共 (5) 个答案

  1. # 2 楼答案

    你可以使用一个更简单的模式和一个捕获组

    .*_(.*)\.nc
    

    默认情况下,第一个.*将是“贪婪的”,并在_之前使用尽可能多的字符,只在(.*)中留下所需的字符串

    演示:http://regex101.com/r/aI2xQ9/1

    Java代码:

    String input = "PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc";
    Pattern pattern = Pattern.compile(".*_(.*)\\.nc");
    Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
       String group = matcher.group(1);
       // ...
    }
    
  2. # 3 楼答案

    你可以使用下面的正则表达式

    (?<=_)[^_]*(?=\.nc)
    

    在您的模式中,只需将.*替换为[^_]*,使其与内部字符串匹配

    DEMO

    String s = "PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc";
    Pattern regex = Pattern.compile("(?<=_)[^_]*(?=\\.nc)");
    Matcher regexMatcher = regex.matcher(s);
    if (regexMatcher.find()) {
     String ResultString = regexMatcher.group();
     System.out.println(ResultString);
     } //=> 20140809T0000Z
    
  3. # 4 楼答案

    你只需要对这个需求进行前瞻

    你可以使用:

    [^._]+(?=[^_]*$)
    
    // matches and returns 20140809T0000Z
    

    RegEx Demo

  4. # 5 楼答案

    RegEx并不总是最好的解决方案……:)

    String pattern="PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc";
    int start=pattern.lastIndexOf("_") + 1;
    int end=pattern.lastIndexOf(".");
    if(start != 0 && end != -1 && end > start) {
         System.out.println(pattern.substring(start,end);
    }