java - 如何使一个组可选,它捕获模式并捕获相同的组号?

标签 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

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

最佳答案

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

(\\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

<小时/>

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

关于java - 如何使一个组可选,它捕获模式并捕获相同的组号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15890038/

相关文章:

Java 二维数组填充模式

java - 如何通过@IndexColumn 中的数字选择集合中的第 n 个元素?

java - 为什么 Maven Assembly Plugin 不将我的项目文件包含在具有依赖项的 jar 中?

javascript - HTML 上的 Django 导航文本

PHP 用 URL 替换字符串中的模式

regex - VS Code 多行搜索和替换 HTML/XML 标签?

regex - 无法在正则表达式中捕获单引号

java - 为什么 SelectOneMenu 会忽略转换器?

java - 实现游戏 GUI

javascript - 如何降低正则表达式的复杂性?