有条件替换字符

时间:2019-04-11 08:42:08

标签: pcre

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

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是否可能?

1 个答案:

答案 0 :(得分: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-匹配重置运算符,该匹配运算符会丢弃匹配内存缓冲区中到目前为止已匹配的所有文本
  • !-一个!字符。