正则表达式以查找字符串并根据条件替换或添加其他字符

时间:2019-04-16 05:55:56

标签: java c# regex

当字符串以{{m|gem-pro|*karzijan?||to turn}}开头并以{{m结尾时,我有一个字符串}},我想用to turn括起来的方括号将()括起来在}}

之前

字符串: {{m|gem-pro|*karzijan?||to turn}}

必需的字符串: {{m|gem-pro|*karzijan?||(to turn)}}

该字符串不仅可以是to turn,而且可以是任何字符串。

3 个答案:

答案 0 :(得分:3)

您可以使用前瞻性强的2个捕获组:

({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})

在Java中

String regex = "(\\{\\{m(?:\\|[^\\|]+)*\\|\\|)([^\\}]+)(?=\\}})";

关于图案

  • (捕获组1
    • {{m字面上匹配
    • (?:\|[^\|]+)*重复匹配|的0次以上,然后不匹配|
    • \|\|匹配||
  • )关闭第1组
  • (捕获组2
    • [^}]+不匹配1次以上}
  • )关闭第2组
  • (?=}})前瞻性,断言右边直接是}}

Pattern demo

在替换中,使用2个捕获组:

$1($2)

例如在C#中:

string pattern = @"({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}})";
string input = @"{{m|gem-pro|*karzijan?||to turn}}";
Console.WriteLine(Regex.Replace(input, pattern, @"$1($2)"));

答案 1 :(得分:2)

您可以尝试使用此正则表达式:

{{m(.+)\|\|(.+)}}

和此替换模式:

{{m\1||(\2)}}

工作示例https://regex101.com/r/3inQ3p/1

答案 2 :(得分:1)

您可以使用以下正则表达式:

class MyDict<T> {
    var dict = [Int:T]()
}

let c1 = MyDict<A>()
let c2 = MyDict<B>()

和替换项:

(\{\{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

演示: https://regex101.com/r/yoo9KG/2/

说明:

  • {{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\|[^}]*\|)开头,后跟0到N个字符的字符串,直到到达{{m为止,这些字符不是}|位于您的{{ 1}}结构。可以通过{{m...|...|..}}
  • 反向引用捕获组
  • \1将匹配结构中的最后一个字符串,并将其存储在第二个捕获组中。
  • ([^|}]*)将捕获最后2个(\}\})并将其存储在第3组中。
  • 在替换中使用3个反向引用,并用括号将第二个反向引用括起来以达到结果。

java代码:

}

输出:

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);