只有在输入中存在特殊序列时,我才想替换长字符串中的字符。例:
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更换吗?
一般来说,这可以使用任何支持\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
- 匹配重置运算符,丢弃匹配内存缓冲区中到目前为止匹配的所有文本