0
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)OR时,我希望相同的组号适用于两者ap2345

4

1 回答 1

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

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

输出示例ap23452 ->ap2345


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

于 2013-04-08T22:47:41.180 回答