[英]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])[^\[\]]+\]
這樣,您將匹配整個嵌套方括號或未嵌套方括號。 然后,僅在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.