【问题标题】:Find string after last underscore before dot extension在点扩展之前的最后一个下划线之后查找字符串
【发布时间】:2014-08-05 14:35:09
【问题描述】:

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

PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc

我尝试了以下方法来保留.nc之前的字符串:

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

我有以下从最后一个下划线开始:

/_[^_]*$/

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

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您只需要对此要求进行前瞻。

      你可以使用:

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

      RegEx Demo

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案4】:

          您可以对捕获组使用更简单的模式

          .*_(.*)\.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);
             // ...
          }
          

          【讨论】:

            【解决方案5】:

            因此,您需要紧接句点字符之前的一系列非下划线字符。

            试试[^_.]+(?=\.)

            演示:https://regex101.com/r/sLAnVs/2

            感谢Cary Swoveland 指出“无需在字符类中转义句点”。

            【讨论】:

            • @CarySwoveland 感谢您的评论,我不知道这一点。我已经更新了答案。
            猜你喜欢
            • 1970-01-01
            • 2020-12-02
            • 2021-01-01
            • 1970-01-01
            • 2019-12-22
            • 2014-03-23
            • 2012-01-29
            • 2018-09-28
            • 2019-05-13
            相关资源
            最近更新 更多