簡體   English   中英

字符串替換所有正則表達式模式,如果嵌套則不匹配

[英]string replace all regex pattern to NOT match if nested

考慮下面的情況我有一個輸入字符串

"input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"

在全部替換為全后,我想要的輸出字符串[yes]將被替換為“ Yes但是如果嵌套在次要或n個子句中,則應忽略此類模式,這里的假設是所有開括號都將正確閉合,這是所需的輸出字符串

"input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]]"

簡而言之,這是我的問題,正則表達式可以理解“嵌套”模式嗎? 還是遞歸是做到這一點的絕對必要,而正則表達式根本不夠用

如果無法檢測到無限嵌套的正則表達式,那么僅像我的示例那樣嵌套到第二級

編輯1

由於無法使用vks指出的regex做到這一點,因此我編寫了一個簡單的程序,該程序將用Java為您做同樣的事情:

public class Main {

    public static String nestedReplace(String s) {
        int nested =0,i=0;
        StringBuilder o = new StringBuilder();
        while(i<s.length())
        {
            if(nested==0 && s.regionMatches(i,"[yes]",0,4))
            {
                o.append("Yes");
                i += 5;
                continue;
            }
            else if(s.charAt(i) == '[')
                nested++;
            else if(s.charAt(i) == ']')
                nested--;
            o.append(s.charAt(i));
            i++;
        }
        return new String(o);
    }

    public static void main(String[] args) {
        System.out.println(nestedReplace("input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"));
    }
}

輸出:

input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]]

嘗試:

\[[^\[\]]+\[.+?][^\[\]]*\]|\[([a-z])[^\[\]]+\]

DEMO

這樣,您將匹配整個嵌套方括號或未嵌套方括號。 然后,僅在Matcher找到group(1) (而不是嵌套的括號)時替換內容,例如:

public class Test {
    public static void main(String[] args){
        String[] strings = {"input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]",
                "input [yes] [yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]",
                "input [yes] [yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"};

        Pattern pattern = Pattern.compile("\\[[^\\[\\]]+\\[.+?][^\\[\\]]*\\]|\\[([a-z])[^\\[\\]]+\\]");

        for(String string : strings) {
            Matcher matcher = pattern.matcher(string);
            while (true) {

                if (matcher.find()) {
                    if (matcher.group(1) != null) {
                        string = string.substring(0, matcher.start(1)) + string.substring(matcher.start(1), matcher.end(1)).toUpperCase() + string.substring(matcher.end(1));
                        matcher.reset(string);
                    }
                } else {
                    break;
                }
            }
            System.out.println(string);
        }
    }
}

給出輸出:

input [Yes] [Yes] [Yes] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]]
input [Yes] [Yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [Yes] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]]
input [Yes] [Yes] [yes[yes] [yes] [yes] [mk:[yes] [yes] [yes]] [mk:[yes] [yes] [yes]] [Yes] [iif:[yes] [yes] [yes]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM