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:不客气,如果您有任何问题,请告诉我!兄弟如何匹配除了两条垂直线以外的所有东西