繁体   English   中英

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

[英]extract values from string with Regular Expression

我有这个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是任何特定于协议的计数器,不需要我

IGNORE位于第2和第3个捕获组之间时,您可以使用调和贪婪令牌以确保您没有匹配:

\\*1\\*(.*?)\\*11\\*(.*?)\\*(?:(?!IGNORE).)*\\*53\\*(.*?)##

演示 在这种情况下,第3组不能包含 IGNORE

当您需要匹配两个不包含某些子字符串的子模式之间的最近窗口时,该标记很有用。

如果您不希望第3组与IGNORE 相等 ,请使用否定IGNORE

\\*1\\*(.*?)\\*11\\*(.*?)\\*(?!IGNORE\\*)(.*?)\\*53\\*(.*?)##
                             ^^^^^^^^^^^^

演示

始终忽略第3个参数:

只是不要创建捕获(不要使用括号)。

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

拆分*上的输入并将IGNORE视为分隔符的可选部分,首先修剪掉前缀和后缀:

String[] parts = msg.replaceAll("^\\*\\d\\*|##$","").split("(\\*IGNORE)?\\*\\d+\\*");

一些测试代码:

String msg = "*1*20*11*30*IGNORE*53*40##";
String[] parts = msg.replaceAll("^\\*\\d\\*|##$","").split("(\\*IGNORE)?\\*\\d+\\*");
System.out.println(Arrays.toString(parts));

输出:

[20, 30, 40]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM