正则表达式:替换部分正则表达式匹配
使用Vim,Notepad ++或Sublime我希望能够搜索并替换部分的匹配。我认为这可以使用负面看法来完成,但我想征求社区的意见。正则表达式:替换部分正则表达式匹配
说我想在下面的示例来代替“脱离”与“辐射”事件:
- 他们担心放射性落下灰和辐射。
- 有跌倒,然后有辐射。
- 在长崎,最大的担忧之一是跌倒。
- 21世纪最好的游戏之一是“掉出”。
一个反例:
- 将属于你的范围之外。
我想一个明显的模式匹配是:
fall out[^a-z]
但随着“辐射”这个比赛中换人比赛在这里将有不良影响,即逗号,空间,周期和尾随引号中四个正面的例子将被删除。
人们通常会如何处理这个问题,以及奖金,你会如何在比赛中保留上下套筒?
虽然你可以用负向预测来做你想要的,但我不认为你需要它,你可以简单地使用零宽度原子\>
(参见: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
。
超级有希望,并有详细的解释,但是这不仅适用于Vim吗? – JonasJSchreiber
@JonasJSchreiber对,对不起。我错过了你的问题比Vim更普遍的事实。不幸的是,我不知道其他编辑器中的正则表达式引擎是如何工作的,所以我不确定添加更多关于它们的信息。不过,我认为无论您使用哪种编辑器,您需要查找的关键字都是“捕获组”,“文字边界”和“反向引用”。这些构造的符号可能会不同于正则表达式引擎,但它们的目的应该是相同的。 – user852573
@JonasJSchreiber例如,在崇高中,我认为括号可以用来表达一个捕获组,就像在Vim中一样。 '\ 1'和'\ 2'可能可以用作替换部分的反向引用。唯一不同的是字的界限,在崇高中它应该是'\ b',而在Vim中则是'\ '。但重要的是,恕我直言,不是结构本身,而是它们的意义。结构可能会改变,但通常意义将保持不变。 – user852573
用np ++例如使用['\ bfall out \ b'](https://regex101.com/r/NlgKPG/1)。如果感兴趣,请参阅[SO关于*字界线的文档](https://*.com/documentation/regex/1539/word-boundary#t=201707302028316100317)。 –