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
答案 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\\)|$)
。