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)}}
添加回答
举报