3 回答

TA貢獻1829條經驗 獲得超6個贊
您可以使用 2 個具有正向前瞻性的捕獲組:
({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})
在 Java 中
String regex = "(\\{\\{m(?:\\|[^\\|]+)*\\|\\|)([^\\}]+)(?=\\}})";
關于圖案
(
捕獲組 1{{m
從字面上匹配(?:\|[^\|]+)*
重復 0+ 次匹配|
,然后不匹配|
\|\|
匹配 ||)
關閉組 1(
捕獲組 2[^}]+
匹配 1+ 次不 })
關閉組 2(?=}})
正向前瞻,斷言右邊是 }}
在替換中,使用 2 個捕獲組:
$1($2)
例如在 C# 中:
string pattern = @"({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})";
string input = @"{{m|gem-pro|*karzijan?||to turn}}";
Console.WriteLine(Regex.Replace(input, pattern, @"$1($2)"));

TA貢獻1856條經驗 獲得超5個贊

TA貢獻2019條經驗 獲得超9個贊
您可以使用以下正則表達式:
(\{\{m\|[^}]*\|)([^|}]*)(\}\})
和替換:
\1(\2)\3
輸入:
{{m|gem-pro|*karzijan?||to turn}}
{{m|gem-pro|*karzijan?||abc}}
{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}
{{do nothing}}
#do nothing
輸出:
{{m|gem-pro|*karzijan?||(to turn)}}
{{m|gem-pro|*karzijan?||(abc)}}
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}
{{do nothing}}
#do nothing
演示: https ://regex101.com/r/yoo9KG/2/
說明:
(\{\{m\|[^}]*\|)
將捕獲{{m
以 0 到 N 字符開頭的字符串,}
直到到達 a|
,即位于您的{{m...|...|..}}
結構中的最后一個字符。捕獲組可以通過反向引用\1
([^|}]*)
將匹配結構中的最后一個字符串并將其存儲在第二個捕獲組中。(\}\})
將捕獲最后 2 個}
并將其存儲在第 3 組中。您在替換中使用了 3 個反向引用,并用括號括住第二個以達到您的結果。
爪哇代碼:
String input = "{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}";
String output = input.replaceAll("(\\{\\{m\\|[^}]*\\|)([^|}]*)(\\}\\})", "$1($2)$3");
System.out.println(output);
輸出:
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}
添加回答
舉報