Regex 正则表达式:替换正则表达式匹配的部分

Regex 正则表达式:替换正则表达式匹配的部分,regex,vim,negative-lookahead,Regex,Vim,Negative Lookahead,使用Vim、Notepad++或Sublime,我希望能够搜索和替换匹配的部分。我认为这可以通过消极前瞻来实现,但我想征求社区的意见 假设我想用以下示例中的“辐射”来替换“争吵”事件: 他们担心核泄漏和核辐射 先是脱落,然后是辐射 在长崎,最大的担忧之一是争吵 2000年代最棒的游戏之一是“闹翻天” 反例: 那不属于你的职权范围 我认为一个明显的模式是: fall out[^a-z] 但是,在这里用“fallout”替换匹配将产生不良影响,即四个正面示例中的逗号、空格、句号和尾随引号将

使用Vim、Notepad++或Sublime,我希望能够搜索和替换匹配的部分。我认为这可以通过消极前瞻来实现,但我想征求社区的意见

假设我想用以下示例中的“辐射”来替换“争吵”事件:

  • 他们担心核泄漏和核辐射
  • 先是脱落,然后是辐射
  • 在长崎,最大的担忧之一是争吵
  • 2000年代最棒的游戏之一是“闹翻天”
反例:

  • 那不属于你的职权范围
我认为一个明显的模式是:

fall out[^a-z]
但是,在这里用“fallout”替换匹配将产生不良影响,即四个正面示例中的逗号、空格、句号和尾随引号将被删除


人们通常是如何处理这个问题的,另外,你会如何在比赛中保持上下两个字母的大小写?

虽然你可以通过消极的前瞻性来做你想做的事情,但我认为你不需要这样做,你可以简单地用零宽度原子来描述一个单词的结尾

\>
表示前一个字符是单词的最后一个字符(从技术上讲,是缓冲区本地选项中的最后一个字符
'iskeyword'

至于案例问题,您可以使用捕获组(请参见
:h/\(
)来捕获
fall
out
,以便您可以在替换命令的替换部分中引用它们

它将提供:

:%s/\v\c<(fall)\s+(out)>/\1\2/g
细分:

%s/\v\c<fall\zs\s+\zeout>//g
            │     │
            │     └─ sets the end of the match
            └─ sets the start of the match
%s/\v\c//g
│     │
│     └─ 设定比赛的终点
└─ 设置比赛的开始

这一次,您使用原子
\zs
\ze
来设置匹配的开始和结束。有关详细信息,请参见
:h/\zs
:h/\ze

使用np++eg。查看是否感兴趣。非常有前途,详细的解释,但这不仅适用于Vim吗?@JonasJSchreiber啊,很抱歉。我错了你的问题比Vim更一般。不幸的是,我不知道其他编辑器中的正则表达式引擎是如何工作的,所以我没有信心添加更多关于它们的信息。但是,我认为无论你使用什么编辑器,你需要查找的关键词是
捕获组
单词边界
反向引用nce
。这些构造的符号可能因正则表达式引擎而异,但它们的用途应该是相同的。@例如,在sublime中的JonasJSchreiber,我认为括号可以用来表示捕获组,就像在Vim中一样。
\1
\2
可能可以用作替换部分的反向引用。Th唯一不同的是单词边界,在sublime中应该是
\b
,而在Vim中则是
\
。但重要的是,imho,不是结构本身,而是它们的意义。结构可能会改变,但通常意义会保持不变。
:%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