使用 Vim、Notepad++ 或 Sublime 我希望能够搜索和替换匹配的部分。我认为这可以使用负面前瞻来完成,但我想征求社区的意见。
假设我想在以下示例中用“fallout”替换“fallout”事件:
反例:
我想一个明显的匹配模式是:
fall out[^a-z]
但是用这个匹配替换这里的“fallout”匹配会产生不良影响,即四个正例中的逗号、空格、句号和尾随引号将被删除。
人们通常如何处理这个问题,以及奖金,您将如何在比赛中保留上下大小写?
最佳答案
尽管您可能可以通过负前瞻做您想做的事情,但我认为您不需要这样做,您可以简单地使用零宽度原子 \>
(参见 :h /\>
)来描述单词的结尾。\>
意味着前一个字符是单词的最后一个(从技术上讲是缓冲区本地选项中的最后一个字符 'iskeyword'
)。
至于案例问题,您可以使用捕获组(参见 :h /\(
)来捕获 fall
和 out
,以便您可以在替换命令的替换部分中引用它们。
它会给:
:%s/\v\c<(fall)\s+(out)>/\1\2/g
稍微分解一下:
┌──────── capture `fall`
│ ┌ capture `out`
┌────┤ ┌───┤
%s/\v\c<(fall)\s+(out)>/\1\2/g
│ │
│ └─ use the text from the 2nd capturing group (will preserve the case)
└─ use the text from the 1st capturing group (will preserve the case)
\s+
描述了一系列空白字符(至少一个)。\c
将使模式不区分大小写,并且 \v
启用非常神奇的模式。没有它,您将不得不在模式中转义多个原子/量词。编辑:
实际上,您可以通过删除空格序列来简化命令:
:%s/\v\c<fall\zs\s+\zeout>//g
分解:
%s/\v\c<fall\zs\s+\zeout>//g
│ │
│ └─ sets the end of the match
└─ sets the start of the match
这一次,你使用原子
\zs
和 \ze
设置比赛的开始和结束。见 :h /\zs
和 :h /\ze
想要查询更多的信息。
关于regex - 正则表达式 : Replacing Portions of a Regex Match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403188/