我是一个正则表达式超级菜鸟(刚刚阅读了我的第一篇关于它们的文章),同时致力于更好地使用 vim。我想使用正则表达式来搜索冒号的所有实例:
后面没有空格并且insert一个空间between这些冒号及其后面的任何字符。
如果我从以下开始:
foo:bar
我想结束
foo: bar
我已经到达%s/:[a-z]
但现在我不知道接下来的部分要做什么%s
陈述。
另外,我该如何更改:[a-z]
声明以确保它捕获任何不是空格的内容?
:%s/:\(\S\)/: \1/g
\S
匹配任何非空白字符,但您需要记住该非空白字符是什么。这就是\(\)
做。然后您可以使用它来引用它\1
在替换中。
所以你匹配一个:
,一些非空白字符,然后将其替换为:
、空格和捕获的字符。
更改此设置以仅在只有一个时修改文本:
相当简单。正如其他人所建议的,使用一些零宽度断言将会很有用。
:%s/:\@!<:[^:[:space:]]\@=/: /g
:\@!<
匹配任何非:
,包括行的开头。这是否定前瞻/后瞻断言的一个重要特征。它并不要求实际上有一个角色,只是没有一个角色:
.
:
匹配所需的冒号。
-
[^:[:space:]]
引入了更多正则表达式概念。
外层[]
是一个集合。集合用于匹配其中列出的任何字符。然而,领先的^
否定该匹配。所以,[abc123]
将匹配a
, b
, c
, 1
, 2
, or 3
, but [^abc123]
匹配除这些字符之外的任何字符。
[:space:]
是一个字符类。字符类只能在集合内使用。[:space:]
毫不奇怪,意味着任何空白。在大多数实现中,它与 C 库的结果直接相关isspace
功能。
将所有这些结合在一起,该集合意味着“匹配任何不是:
或空白”。
\@=
是积极的前瞻断言。它适用于前一个原子(在本例中为集合),意味着该集合是模式成功匹配所必需的,但不会成为被替换文本的一部分。
因此,每当模式匹配时,我们只需替换:
与它本身和一个空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)