正则表达式查找字符串并替换它或根据条件添加额外字符
Posted
技术标签:
【中文标题】正则表达式查找字符串并替换它或根据条件添加额外字符【英文标题】: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
和替换模式中的括号。
【参考方案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以上是关于正则表达式查找字符串并替换它或根据条件添加额外字符的主要内容,如果未能解决你的问题,请参考以下文章
需要使用正则表达式找到2个字符串,并在它们之间插入多行文本并插入替换文本