如何在Java的正则表达式中获得第二个匹配器?

时间:2018-08-08 11:07:14

标签: java regex

我要提取此字符串中-_之间的正则表达式模式中的第二个匹配器:

VA-123456-124_VRG.tif

我尝试过:

Pattern mpattern = Pattern.compile("-.*?_");

但是对于Java中的上述正则表达式,我得到了123456-124

我只需要124

我该如何实现?

6 个答案:

答案 0 :(得分:4)

如果您知道这是您的格式,则会返回要求的数字。

下划线之前不是破折号的所有内容

Pattern pattern = Pattern.compile("([^\-]+)_");

答案 1 :(得分:3)

我将在这里使用正式的模式匹配器,以使其尽可能具体。我会使用这种模式:

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

,然后检查第一个捕获组是否可能匹配。这是一个工作代码段:

String input = "A-123456-124_VRG.tif";
String pattern = "^[^-]+-[^-]+-([^_]+).*";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);

if (m.find()) {
   System.out.println("Found value: " + m.group(1) );
}

124

Demo

顺便说一句,有一个衬板也可以在这里工作:

System.out.println(input.split("[_-]")[2]);

但是,这里需要说明的是,它不是很具体,可能无法用于其他数据。

答案 2 :(得分:2)

您知道您只需要数字,因此更具体Pattern.compile("-([0-9]+)_");

答案 3 :(得分:1)

尝试使用以下正则表达式:

.*-(.*?)_

这将是:。* 将匹配所有字符,直到找到-为止。另外,由于它很贪婪,它会尝试找到最后一个可能的选项,即24点之前。

演示:Method for scrolling to a time #467

JShell输出:

jshell> Pattern pattern = Pattern.compile(".*-(.*?)_");
pattern ==> .*-(.*?)_

jshell> Matcher matcher = pattern.matcher("VA-123456-124_VRG.tif");
matcher ==> java.util.regex.Matcher[pattern=.*-(.*?)_ region=0,21 lastmatch=]

jshell> if(matcher.find()){
   ...> System.out.println(matcher.group(1));
   ...> }
124

答案 4 :(得分:1)

您的测试用例很低,但是如果我回答您的测试用例,我认为下面的正则表达式会有所帮助。

-.*-(.*)_

然后提取第一组。

答案 5 :(得分:1)

如果您只是想以简单的方式提取内容,请继续

public static void main(String[] args) {
    String s  = "VA-123456-124_VRG.tif";
    System.out.println(s.split("[_-]")[2]);
}