有条件地替换一个角色

问题描述 投票:1回答:1

只有在输入中存在特殊序列时,我才想替换长字符串中的字符。例:

This string is a sample! I wrote it to describe my problem! I hope somebody can help me with this! I have the ID: 12345! That's all!

我想要的输出是:

This string is a sample. I wrote it to describe my problem. I hope somebody can help me with this. I have the ID: 12345. That's all.

仅当输入字符串中存在'12345'时。

我试过(正面)负面观察(前面|后面)

(?<!=12345)(!+(.*))+

不起作用,所以?=,?!...

这可以通过一步完成PCRE更换吗?

pcre
1个回答
1
投票

一般来说,这可以使用任何支持\G“前一个匹配的字符串开始/结束”运算符的正则表达式。使用以下模式搜索时,您可以使用$1 +所需文本替换:

(?:\G(?!^)|^(?=.*CHECKME))(.*?)REPLACEME     <-- Replace REPLACEME if CHECKME is present
(?:\G(?!^)|^(?!.*CHECKME))(.*?)REPLACEME     <-- Replace REPLACEME if CHECKME is absent

使用支持\K的Perl / PCRE / Onigmo,您可以在搜索时替换为所需的文本

(?:\G(?!^)|^(?=.*CHECKME)).*?\KREPLACEME     <-- Replace REPLACEME if CHECKME is present
(?:\G(?!^)|^(?!.*CHECKME)).*?\KREPLACEME     <-- Replace REPLACEME if CHECKME is absent

在您的情况下,由于搜索的文本是单个字符,您可以使用更有效的正则表达式只有一个.*

(?:\G(?!^)|^(?=.*12345))[^!]*\K!

并用.替换(或者如果你使用$1.则用(?:\G(?!^)|^(?=.*12345))([^!]*)!替换)。见regex demo

如果字符串中可以有换行符,请使用(?s)(?:\G(?!^)|^(?=.*12345))[^!]*\K!

细节

  • (?:\G(?!^)|^(?=.*12345)) - 上一场比赛结束(\G(?!^))或(|)一个字符串位置的开始,随后是尽可能多的0+字符,直到最后一次出现的12345^(?=.*12345)
  • [^!]* - 除了!之外的0个或更多个字符
  • \K - 匹配重置运算符,丢弃匹配内存缓冲区中到目前为止匹配的所有文本
  • qazxsw poi - 一张qazxsw poi图表。
© www.soinside.com 2019 - 2024. All rights reserved.