regex - 正则表达式 : Replacing Portions of a Regex Match

标签 regex vim negative-lookahead

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

假设我想在以下示例中用“fallout”替换“fallout”事件:

  • 他们担心核泄漏和辐射。
  • 有脱落,然后有辐射。
  • 在长崎,最大的担忧之一就是闹翻。
  • 2000 年代最好的游戏之一是“跌倒”。

  • 反例:
  • 那将超出您的权限。

  • 我想一个明显的匹配模式是:
    fall out[^a-z]
    

    但是用这个匹配替换这里的“fallout”匹配会产生不良影响,即四个正例中的逗号、空格、句号和尾随引号将被删除。

    人们通常如何处理这个问题,以及奖金,您将如何在比赛中保留上下大小写?

    最佳答案

    尽管您可能可以通过负前瞻做您想做的事情,但我认为您不需要这样做,您可以简单地使用零宽度原子 \> (参见 :h /\> )来描述单词的结尾。
    \>意味着前一个字符是单词的最后一个(从技术上讲是缓冲区本地选项中的最后一个字符 'iskeyword' )。

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

    它会给:

    :%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/

    相关文章:

    python - 正则表达式:将字符串匹配到模式(可能不存在)

    python - 使用python正则表达式查找重复表达式

    python - 使用 python 正则表达式匹配但不包括其中之一

    php - 正则表达式:将除YouTube链接之外的所有链接与视频进行匹配

    linux - Ubuntu 16.04 LTS - 无法在 VIM 中启用 xterm_clipboard

    vim - 如何在当前行之后加入上面的行?

    python - 防止在正则表达式上回溯以查找非注释行(不是以缩进 '#' 开头)

    Java 正则表达式非法转义字符错误不会从命令行参数发生

    python - 构建正则表达式以至少识别给定的间隔

    vim - Vim:执行命令后如何保持视觉模式