【问题标题】:Regex to find a string and Replace it or add extra characters based on a condition正则表达式查找字符串并替换它或根据条件添加额外字符
【发布时间】:2019-09-06 03:46:44
【问题描述】:

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

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

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

字符串不仅可以是to turn,还可以是任何字符串。

【问题讨论】:

  • 试试({{m(?:\|[^\|]+)*\|\|)([^}]+}})regex101.com/r/nBRZeq/1
  • @Thefourthbird 它目前返回 (to turn}}) 而不是 (to turn)}}
  • @IldarAkhmetov 查看此更新({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=}}) regex101.com/r/nBRZeq/2
  • @Thefourthbird 这是一个比我更聪明的解决方案,因为它只有 \1\2 和替换模式中的括号。

标签: java c# regex


【解决方案1】:

您可以使用 2 个具有正向前瞻的捕获组:

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

在 Java 中

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

关于模式

  • (捕获组1
    • {{m 字面匹配
    • (?:\|[^\|]+)* 重复 0+ 次匹配 | 后跟不匹配 |
    • \|\|匹配||
  • )关闭第一组
  • (捕获组2
    • [^}]+ 匹配 1+ 次不 }
  • )关闭第二组
  • (?=}})正向前瞻,断言右边是}}

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

【讨论】:

  • 字符串由重复组成,它会改变行中的所有内容,例如:{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}
  • @VINNUSAURUS 是的,它会 regex101.com/r/nBRZeq/3 但在 Java 或 C# 中,您也可以选择仅替换第一个匹配项。
【解决方案2】:

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

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

还有这个替换模式:

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

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

【讨论】:

  • 你能发布java版本的正则表达式吗?
【解决方案3】:

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

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

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

输出:

{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}

【讨论】:

  • @VINNUSAURUS:不客气,如果您有任何问题,请告诉我!
  • 兄弟如何匹配除了两条垂直线之外的所有内容|*karros||wagon}}
  • @VINNUSAURUS:\{\{m\|(?:(?!\|\|).)* 演示怎么样:regex101.com/r/yoo9KG/4
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2019-06-18
  • 2019-09-07
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多