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

Java 查找点扩展名前最后一个下划线后的字符串,java,regex,Java,Regex,我需要在此字符串中找到20140809T0000Z: PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc 我尝试了以下操作以将字符串保留在.nc之前: 如何使用正则表达式查找点扩展之前最后一个下划线之后的字符串?您可以使用下面的正则表达式 (?<=_)[^_]*(?=\.nc) 您只需要对这个需求进行前瞻 您可以使用: [^._]+(?=[^_]*$) // matches and returns 20140809T0000Z 正则表达式并

我需要在此字符串中找到20140809T0000Z:

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


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

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

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

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

您可以使用:

[^._]+(?=[^_]*$)

// matches and returns 20140809T0000Z

正则表达式并不总是最好的解决方案…:

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

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

.*_(.*)\.nc
默认情况下,第一个.*将是贪婪的,并且在x之前消耗尽可能多的字符,只在.*中留下所需的字符串

演示:

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