关于 vim 的 magic 设置

文章目录

  • 一、magic 介绍
  • 二、设置 magic
    • (一)长效设置
    • (二)临时设置
    • (三)magic 示例
      • 1. 匹配由 3 个以字母 a 开头,以字母 c 结尾,中间是任意一个字符的子串组成的字符串
        • (1)very magic 模式下
        • (2)magic 模式下
        • (3)nomagic 模式下
        • (4)very nomagic
      • 2. 在一个 CSS 样式文件中查找所有的颜色代码
        • (1)magic 模式下
        • (2)very magic 模式下

一、magic 介绍

vim 毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像 perl 那样), 势必会给不懂正则表达式的人造成麻烦,比如 /foo(1) 命令, 大多数人都用它来查找foo(1)这个字符串, 但如果按照常规的正则表达式来解释,被查找的对象就成了 foo1 了。因为在小括号 () 不是普通的字符,而是有特殊含义的字符,小括号 () 包裹的内容视为一个整体项,这里小括号只含有 1,那么就匹配 1,加上前面的字符串 foo,那么匹配的字符串就是 foo1

于是,vim 就规定,常规的正则表达式的元字符必须用反斜杠进行转义才行, 如上面的例子,如果确实要用常规的正则表达式,就应当写成 /foo\(1\) 。 但是,像 .* 这种极其常用的正则表达式元字符,都加上反斜杠就太麻烦了。 而且,众口难调,有些人喜欢用常规的正则表达式,有些人不喜欢用…

为了解决这个问题,vim 设计 magic 这个东西。简单地说, magic 就是用来设置哪些元字符要加反斜杠哪些不用加的工具。

二、设置 magic

(一)长效设置

要在“底行命令模式”下设置 vim 的 magic,设定方法为:

命令说明
set magic设置 magic,除了 $.*^[ ] 之外其他正则表达式的元字符都要加反斜杠进行转义,否则视为普通的字符,这是 vim 的默认设置
set nomagic取消 magic,除了 $^ 之外其他元字符都要加反斜杠
h magic查看帮助

(二)临时设置

这个设置也可以在正则表达式中通过 \m\M\v\V 共 4 个开关来临时切换。

设置指令说明
\m表示后面的正则表达式会按照 magic 处理,例如,/\m.*(ktv),后面的 (ktv) 是 5 个普通的字符,而不是分组,要当成分组使用,小括号前面要加上转义符号 \ 才行
\M后面的正则表达式按照 nomagic 处理, 而忽略实际的 magic 设置
\vvery magic,意为非常魔幻,又叫模式开关。任何元字符都不用加反斜杠,vim 会自动识别元字符。该模式下,除下划线 _#、英文字母以及数字之外的所有字符都具有特殊含义
\Vvery nomagic,意为非常不魔幻,其实就是非常不智能,非常傻的模式,又叫原义开关。任何元字符都必须加反斜杠,任何有特殊含义的字符都必须加反斜杠,否则视为普通字符。该模式下只有反斜杠 \ 具有特殊意义,其它的都是普通字符

注:

  1. 默认设置是 magic,vim 也推荐大家都使用 magic 的设置,在有特殊需要时,直接通过临时设置即可。
  2. 一个通用的原则是:如果想按正则表达式查找,就用模式开关 \v,如果想按原义查找文本,就用原义开关 \V

(三)magic 示例

1. 匹配由 3 个以字母 a 开头,以字母 c 结尾,中间是任意一个字符的子串组成的字符串

(1)very magic 模式下

/\v(a.c){3}$

正则表达式解释:

$ 表示行尾,这是个虚拟的概念。{3} 表示前面的字符串要出现 3 次,(a.c),小括号包裹的内容作为一个整体,所以小括号的内容整体要出现3次,. 表示任意一个字符,那么像这样的 abcabcabc,adcafcagc 等都可以匹配,只要确保以 a 开头,以 c 结尾,中间任意一个字符所组成的整体出现 3 次就可以了。

(2)magic 模式下

/\m\(a.c)\{3}$

这里使用 \m,说明除了 $.*^ 之外其他正则表达式的元字符都要加反斜杠进行转义,所以小括号、大括号都需要转义 vim 引擎才会视为元字符,大括号可以只转义左边的,右边的 vim 会自动识别,但是小括号则不行,中括号也只要转义左边即可。

如果不进行转义处理,如下所示:

/\m(a.c){3}$

正则表达式解释:
这里使用 \m,说明除了 $.*^ 之外其他正则表达式的元字符都要加反斜杠进行转义,否则视为普通的字符,所以这里的小括号、花括号都只是普通字符,只有一个字符 . 属于正则表达式的元字符,它表示任意单个字符,所以这个表达式匹配行尾的 (abc){3}(aec){3}(a%c){3} 等这样的字符串。

(3)nomagic 模式下

/\M\(a\.c)\{3}$

使用 \M ,那么就只认 $^,其它字符一律当成普通字符,所以小括号、大括号、. 这些字符都要转义才能视为元字符。

如果不转义,如下所示:

/\M(a.c){3}$

正则表达式解释:
使用 \M ,那么就只认 $^,其它字符一律当成普通字符,字符 . 也只是个普通字符了。所以这个表达式仅匹配行尾的(a.c){3}

(4)very nomagic

/\V\(a\.c)\{3}\$

使用 \V,那么所有的字符都被视为普通字符,所以小括号、大括号、.$ 都需要转义才能视为元字符。

不转义,如下所示:

/\V(a.c){3}$

正则表达式解释:
使用 \V,那么所有的字符都被视为普通字符,所以这个表达式可以匹配文本中任意位置的字符串 (a.c){3}$

2. 在一个 CSS 样式文件中查找所有的颜色代码

查找如下所示的颜色代码:

a {color: #0000EE;}
body {color: #3c3c3c;}
strong {color: #000;}

需要构造一个正则表达式,用于匹配 1 个 # 字符以及紧随其后的 3 个或 6 个十六进制字符的目标串(包括所有数字以及大写或小写的字母)。

(1)magic 模式下

/#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)

如上所示,magic 下,vim 引擎认为 .*$^[ 是元字符,其它都是普通字符,所以小括号、大括号、竖线都要转义才能视为元字符。注意小括号的左右括号都要加 \ 进行转义,不知道为什么?magic 下不是只认识 .*$^ 吗?为什么中括号不要转义呢?

(2)very magic 模式下

/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})

超智能,除了英文字母、数字、下划线、# 以外的字符都是元字符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语言逻辑运算符两侧运算对象_5.3 C语言逻辑运算符与表达式

01优先次序 1、有3种逻辑运算符:与(AND),或(OR),非(NOT)。在basic和Pascal等语言可以在程序中直接用and,or,not作为逻辑运算符。在C语言中不能再程…

rabbitmq 传递文件_使用RabbitMQ进行消息传递

rabbitmq 传递文件RabbitMQ是一个强大的消息代理,可用于实现不同的消息传递模式。 即使有出色的教程 (使用不同的语言和框架),也很难理解这些概念。 在这篇文章中,我想展示一些可以用RabbitMQ实现的不同范例&#xff0…

正则表达式的贪婪模式、非贪婪模式、占有模式

文章目录一、Greediness(贪婪型)(一)贪婪模式示例(二)贪婪模式的匹配过程(贪婪模式的回溯)二、Reluctant(勉强型)(一)非贪婪模式示例&…

深度学习pytorch--线性回归(二)

线性回归无框架实现线性回归的从零开始实现生成数据集(简单的人工构造)读取数据初始化模型参数定义模型定义损失函数定义优化算法训练模型小结完整代码(可直接运行)线性回归的从零开始实现 为了深入理解深度学习是如何工作的,本节不使用强大的深度学习框架&#xf…

乱码 设置界面_和平精英:压轴更新后BUG频出,设置界面崩盘,界面全白变乱码...

引言:陌瑾出品,争做精品!大家好,我是你们的老朋友,陌瑾。和平精英作为当下比较热门的一款PVP即时战斗手游,在6月17日,海岛2.0版本也重装上阵,此次地图更新是和平精英游戏上线以来第1…

spring mvc教程_Spring MVC教程

spring mvc教程1.简介 作为企业Java开发人员,这项工作的主要重点之一是开发Web应用程序。 对于Web应用程序,后果还包括许多挑战。 具体来说,其中一些是状态管理,工作流和验证。 HTTP协议的无状态性质只会使事情变得更加复杂。 Spr…

正则表达式实例解读

文章目录正则式 a?正则式 ^\w\d正则式 (\d){4}|\1{2}正则式 \d{4}|\d{2}正则式 a? 正则式&#xff1a;a? 被匹配的字符串&#xff1a;a<>aava</>ab 看下面的 Java 代码&#xff1a; String test "a<>aava</>abb"; String reg "a…

深度学习pytorch--线性回归(三)

线性回归pytorch框架实现线性回归的简洁实现生成数据集读取数据定义模型初始化模型参数定义损失函数定义优化算法训练模型小结完整代码:线性回归的简洁实现 随着深度学习框架的发展&#xff0c;开发深度学习应用变得越来越便利。实践中&#xff0c;我们通常可以用比上一节更简…

smpp客户端_SMPP Java示例(客户端)

smpp客户端这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例&#xff0c;使用该客户端我们可以简单地提交以将消息发送给单个移动用户&#xff0c;也可以一次将消息广播给多个移动用户。另外&#xff0c;我们将验证交货收据。 出于客户端的目的&…

正则表达式的环视深度剖析

文章目录一、环视基础二、顺序环视匹配过程&#xff08;一&#xff09;顺序肯定环视匹配过程&#xff08;二&#xff09;顺序否定环视匹配过程三、逆序环视匹配过程&#xff08;一&#xff09;逆序环视基础&#xff08;二&#xff09;逆序肯定环视匹配过程1. 逆序表达式的长度固…

深度学习pytorch--softmax回归(一)

softmax回归 前几节介绍的线性回归模型适用于输出为连续值的情景。在另一类情景中&#xff0c;模型输出可以是一个像图像类别这样的离散值。对于这样的离散值预测问题&#xff0c;我们可以使用诸如softmax回归在内的分类模型。和线性回归不同&#xff0c;softmax回归的输出单元…

python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...

接上篇文章《如何用python实现excel中的vlookup功能&#xff1f;》&#xff0c;上篇说到&#xff0c;最近我在做一个小项目&#xff0c;也是用python操作excel解决财务审计工作上的一些问题&#xff0c;以便提高工作效率及其准确性。最终目的&#xff0c;刀哥是想做应收账款账龄…

阿帕奇跨域_阿帕奇齿轮泵

阿帕奇跨域Apache Gearpump是一个实时大数据流引擎。 它于2014年中期在GitHub上作为一个开源项目在英特尔构想&#xff0c;并于2016年3月8日进入Apache孵化。Gearpump的名称是对工程术语“齿轮泵”的指称&#xff0c;它是一个超级简单的泵&#xff0c;由以下组成只有两个齿轮&a…

正则表达式之 NFA 引擎匹配原理详解

文章目录一、为什么要了解引擎匹配原理二、正则表达式引擎三、预备知识&#xff08;一&#xff09;字符串组成&#xff08;二&#xff09;占有字符和零宽度&#xff08;三&#xff09;控制权和传动四、正则表达式简单匹本过程&#xff08;一&#xff09;基础匹配过程&#xff0…

阿帕奇跨域_阿帕奇光束

阿帕奇跨域Apache Beam是一个开放源代码统一模型&#xff0c;用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK&#xff0c;您可以构建一个定义管道的程序。 然后&#xff0c;该管道由Beam支持的分布式处理后端之一执行&#xff0c;这些后端包括Apache Apex &…

unity 启动相机_Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)...

最近做项目需要用到这个功能&#xff0c;就是在Unity中调用Android本地相册或直接打开摄像机拍照并且裁剪一部分用于用户头像&#xff0c;今天研究了一下&#xff0c;那么研究出成果了MOMO一定要分享给大家。Unity与Android的交互还有谁不会&#xff1f;&#xff1f; 如果有不会…

深度学习pytorch--MNIST数据集

图像分类数据集&#xff08;Fashion-MNIST&#xff09; 在介绍softmax回归的实现前我们先引入一个多类图像分类数据集。它将在后面的章节中被多次使用&#xff0c;以方便我们观察比较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常用的是手写数字识别数据集MNIS…

html 元素的属性

全局属性 全局属性是可与所有 HTML 元素一起使用的属性。 事件属性 用来定义某个事件的操作的属性叫事件属性&#xff0c;例如&#xff0c;οnclick“script”&#xff0c;元素上发生鼠标点击时触发 click 事件&#xff0c;click 事件被触发就会执行对应的脚本代码。事件属性…

nosql和rdnms_用于SaaS和NoSQL的Jdbi

nosql和rdnms一个自然的接口&#xff0c;用于与CRM&#xff0c;ERP&#xff0c;会计&#xff0c;营销自动化&#xff0c;NoSQL&#xff0c;平面文件等基于Java的数据集成 Jdbi是用于JavaSQL便利库&#xff0c;它为JDBC提供更自然的Java数据库接口&#xff0c;该接口易于绑定到…

matlab 功率谱密度 汉宁窗_如何理解随机振动的功率谱密度?

一、随机信号和正太分布有什么关系&#xff1f; 二、时域、频域之间功率守恒&#xff1f; 三、自相关又是个什么玩意&#xff1f;作为一个工程师&#xff0c;很多人对随机振动看着熟悉&#xff0c;却又实际陌生。熟悉是因为几乎每个产品在出厂时都要求要做随机振动试验&#xf…