簡體   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