如何创建一个可选的组来捕获模式并捕获相同的组号?

时间:2013-04-08 22:19:44

标签: java regex

Pattern pattern = Pattern.compile("\\d{4}\\s+[a-z|A-Z]{2}\\s+PLAIN\\sTEXT\\s+(.*?)\\(NS\\)");
Matcher matcher = pattern.matcher("2007 AL PLAIN TEXT ap2345 (NS)");
while (matcher.find()) 
{
    System.out.println(matcher.group(1));
}

我希望它适用于input1 = 2007 AL PLAIN TEXT ap2345 (NS)(上面的正则表达式适用于此),但input2 = "ap2345"失败了。我想在同一组号中捕获这两个字符串,这意味着我需要使以前的捕获可选。我怎么能这样做?

编辑:::当字符串值为2007 AL PLAIN TEXT ap2345 (NS)ap2345

时,我希望相同的组号适用于这两者

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了你的问题所以在我解释之前只需检查这个正则表达式

(\\d{4}\\s+[a-zA-Z]{2}\\s+PLAIN\\sTEXT\\s+)?(\\w+)(\\s+\\(NS\\))?

Pattern pattern = Pattern
        .compile("(\\d{4}\\s+[a-zA-Z]{2}\\s+PLAIN\\sTEXT\\s+)?(\\w+)(\\s+\\(NS\\))?");
Matcher matcher = pattern.matcher("2007 AL PLAIN TEXT ap2345 (NS)");
while (matcher.find()) {
    System.out.println(matcher.group(2));
}

2007 AL PLAIN TEXT ap2345 (NS)输出的示例1 - > ap2345

ap2345输出的示例2 - > ap2345


此正则表达式会尝试在 1 组中存储可选部分2007 AL PLAIN TEXT。如果字符串不包含此部分,则组1将包含null。这是可以的,因为我们只对其后的部分感兴趣,它将存储在 2 组中。我假设第2组只包含一个单词,这就是我使用\\w+\\w匹配字母,数字和_)的原因。如果您想接受更多字词,请尝试使用(.+?)(\\s+\\(NS\\)|$)