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时,我希望同一个组号对两个都起作用

最佳答案

我不确定我是否正确理解了您的问题,因此在解释任何内容之前,请检查此正则表达式

(\\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)输出-> ap2345

Example 2用于ap2345输出-> ap2345



此正则表达式将尝试将可选零件2007 AL PLAIN TEXT存储在组1中。如果字符串不包含此零件,则组1将包含null。可以,因为我们只对存储在第2组中的部分内容感兴趣。我认为第2组将只包含一个单词,这就是为什么我使用\\w+\\w匹配字母,数字和)。如果要接受更多单词,请尝试使用_

09-28 07:07