java - 使用正则表达式从字符串中提取值

标签 java regex

我有这个java代码

String msg = "*1*20*11*30*IGNORE*53*40##";
String regex = "\\*1\\*(.*?)\\*11\\*(.*?)\\*(.*?)\\*53\\*(.*?)##";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(msg);
if (matcher.find()) {
    for (int i = 0; i < matcher.groupCount(); i++) {
        System.out.println(matcher.group((i+1)));
    }
}

输出是

20
30
IGNORE
40

我如何更改正则表达式,忽略 IGNORE 字符串? 我想,匹配器找不到写在那里的任何东西。 20、30、40 所在的位置是我需要提取的值,在我的情况下 IGNORE 是任何不需要我的协议(protocol)特定计数器

最佳答案

始终忽略第三个参数:

根本不创建捕获(不使用括号)。

\\*1\\*(.*?)\\*11\\*(.*?)\\*.*?\\*53\\*(.*?)##

独立于位置忽略:

您需要像您正在做的那样捕获 IGNORE 部分,并检查您的循环是否需要忽略它:

String msg = "*1*20*11*30*IGNORE*53*40##";
String regex = "\\*1\\*(.*?)\\*11\\*(.*?)\\*(.*?)\\*53\\*(.*?)##";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(msg);
if (matcher.find()) {
    for (int i = 0; i < matcher.groupCount(); i++) {
        if (!matcher.group(i+1).equals("IGNORE")) {
            System.out.println(matcher.group(i+1));
        }
    }
}

DEMO

关于java - 使用正则表达式从字符串中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32759626/

相关文章:

java - 无法一次加载多个 osm 文件

java - 我们如何检查文件是否已提交到 SVN 存储库?

java - 如何编写 java 正则表达式来匹配 3 位数字以外的任何内容?

regex - 在每个 "|"实例之前删除 7 个数字(任何变体)

javascript - 建议使用 javaScript 验证电子邮件的好模式?

java - 表单加载但进程不会停止

java - 如何将 java 类与已经运行的守护进程连接

java - 如何从 AngularJS 发布到 SpringMVC

java - 匹配换行符后的字符串

javascript - 获取两个字符串之间的组