Java Regex查找字符串并替换它或根据条件添加额外字符

Java Regex查找字符串并替换它或根据条件添加额外字符,java,c#,regex,Java,C#,Regex,我有一个字符串{{m | gem pro |*karzijan?| | to turn}}当一个字符串以{m开头,以}结尾时我想用()括号括住}前面的字符串 字符串: {{m | gem pro |*karzijan?| | to turn}} 所需字符串: 该字符串不仅可以打开,还可以是任何字符串。您可以尝试使用以下正则表达式: 这种替代模式: {{m\1 | |(\2)}} 工作示例:您可以使用两个具有积极前瞻性的捕获组: ({{m(?:\|[^\|]+)*\|\|)([^}]+)(?=

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

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

所需字符串:


该字符串不仅可以
打开
,还可以是任何字符串。

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

这种替代模式:

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


工作示例

您可以使用两个具有积极前瞻性的捕获组:

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

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

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

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

$1($2)
例如在C#中:


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

(\{\{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
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)}}
输出:

{{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
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)}}
演示:

解释:

{{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
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)}}
  • (\{m\\\\\\\\\\[^}]*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    将捕获以
    {m
    结构开头,后跟0到N个字符的字符串,直到到达
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • ([^ |}]*)
    将匹配结构中的最后一个字符串,并将其存储在第二个捕获组中
  • (\}\})
    将捕获最后2个
    }
    并将其存储在第3组中
  • 在替换中使用3个反向引用,并用括号将第2个反向引用括起来以获得结果
java代码:

{{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
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)}}
输出:

{{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
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)}}

尝试
({m(?:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+})而不是
(to turn)}
。@IldarAkhmetov看到这个更新
({m(?:\\\\\\\\\\\\\\\\\\\\\\+)*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,
\2
和替换模式中的括号。字符串由重复组成。它会改变行ex中的所有内容吗:
{m | gem pro |*karzijan?| to turn},{{m | ine pro |*gers-| to bend,turn}
@VINNUSAURUS是的,但在Java或C语言中,您也可以选择只替换第一个匹配项。您可以发布正则表达式的Java版本吗?@VINNUSAURUS:不客气,如果您有任何问题,请告诉我!兄弟如何匹配除了两条垂直线以外的所有东西