【发布时间】:2014-08-05 14:35:09
【问题描述】:
我需要在这个字符串中找到20140809T0000Z:
PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc
我尝试了以下方法来保留.nc之前的字符串:
(?<=_)(.*)(?=.nc)
我有以下从最后一个下划线开始:
/_[^_]*$/
如何使用正则表达式在点扩展前的最后一个下划线之后查找字符串?
【问题讨论】:
我需要在这个字符串中找到20140809T0000Z:
PREVIMER_F2-MARS3D-MENOR1200_20140809T0000Z.nc
我尝试了以下方法来保留.nc之前的字符串:
(?<=_)(.*)(?=.nc)
我有以下从最后一个下划线开始:
/_[^_]*$/
如何使用正则表达式在点扩展前的最后一个下划线之后查找字符串?
【问题讨论】:
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);
}
【讨论】:
【讨论】:
你可以使用下面的正则表达式,
(?<=_)[^_]*(?=\.nc)
在您的模式中,只需将 .* 替换为 [^_]* 以便它匹配内部字符串。
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
【讨论】:
您可以对捕获组使用更简单的模式
.*_(.*)\.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);
// ...
}
【讨论】:
因此,您需要紧接句点字符之前的一系列非下划线字符。
试试[^_.]+(?=\.)
演示:https://regex101.com/r/sLAnVs/2
感谢Cary Swoveland 指出“无需在字符类中转义句点”。
【讨论】: