繁体   English   中英

Vim 正则表达式匹配带有前缀和后缀的字符串

[英]Vim regular expression to match string with prefix and suffix

我想在vim中搜索以“abc”开头并以“xyz”结尾的字符串。

以下是我尝试过的命令:

:1,$g/abc[\w\W]*xyz/
:1,$g/abc\[\\w\\W\]\*xyz/
:1,$g/abc*xyz/

"[\\w\\W]*" 表示 "abc" 和 "xyz" 之间的文本可以是任意字符

"1,$" 表示查找范围是vim打开的文件的第一行到最后一行。

我发现搜索模式

abc[\w\W]*xyz 

适用于https://regex101.com/

为什么它在 vim 中失败?

除非“任何字符”对您的意义与对 Vim 的意义不同,否则下面的命令应该可以工作:

:g/abc.*xyz
  • . 表示“除 EOL 之外的任何字符”。
  • *表示“前一个原子的任意数量(包括 0)”。
  • 1,$可以缩短为%
  • :global默认适用于整个缓冲区,因此您甚至不需要%
  • 如果您不遵循:g/pattern的命令(如:g/foo/d则不需要关闭/

一旦文件变得太大(比如 1GB),":g/abc.*xyz" 就会变得很慢。

我找到

cat fileName | grep abc | grep xyz >> searchResult.txt

比在 vim 中使用搜索功能更有效。

我知道此方法可能会返回以“xyz”开头并以“abc”结尾的行。

但是由于这在我的文件中是很少见的情况(也许其他人不会经常发生这种情况),我想我应该在这里写这个方法。

似乎在集合语法[..]不能使用诸如 \\w 之类的字符类,可能是因为它通过逐字符策略进行测试。 :h /[] :

与集合匹配可能很慢,因为文本中的每个字符都必须与集合中的每个字符进行比较。 尽可能使用上述其他原子之一。 示例:“\\d”比“[0-9]”快得多并且匹配相同的字符。

但是,您可以使用专门为[..]语法准备的类似功能。 再次来自:h /[]

字符类表达式被评估为属于该字符类的字符集。

例子包括:

[:alnum:]     letters and digits                   
[:alpha:]     letters                              
[:blank:]     space and tab characters             
[:cntrl:]     control characters                   
[:digit:]     decimal digits                       
[:graph:]     printable characters excluding space 
[:lower:]     lowercase letters

如果你想一一找到你可以点击

/

然后写

abc.*xyz

并按 Enter 找到该模式的第一次出现。 然后使用n表示下一次出现,使用Shift + n表示前一次出现。 这就是我通常的做法,因为对我来说,修改这些行更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM