我喜欢Vim如何区分words和WORDs,但是regexp语法似乎缺少这种区别。我可以使用\<
和\>
原子来搜索单词边界(宽度为零)。但是,如果我想搜索WORD边界怎么办?似乎一个单词应该有一个ordinary atom,但没有。
这是我能想到的最好的,相当于\<
,但要用WORD而不是单词:
\(\(\s\)\@<=\|^\)
它匹配 后面有零宽度的空白字符或行首。它似乎可以满足我的要求,但对于我想经常重复使用的东西来说却是一个怪物。
我还有一个非常简单但也不太通用的版本,该版本使用\zs
而不是零宽度的后缀。此选项仅在比赛开始时才起作用(即,您不能在要比赛的事物中间使用它):
\(^\|\s\)\zs
有没有办法为此定义自己的原子?还是以某种方式使其更方便使用?在这种情况下,还有其他更好的成语吗?
答案 0 :(得分:1)
首先,根据您的需求,可能有一种更简单的方法。 \<\>
依赖于iskeyword
设置,因此,如果您想要更改它们以始终对WORDS操作,则只需修改该设置即可。但是,如果您想同时使用两者,那将是行不通的。
这是我想出的最短的东西:
" \< for WORD
\S\@<!
" \> for WORD
\S\@!
说明:
\S\@<!
\S
的意思是“非空白字符”,\@<!
的意思是“如果前面的原子与后面的原子不匹配,则宽度为零的匹配。”
\S\@!
\S\@!
后面不能有非空格字符。
使用这些先行/后退方式会更优雅,因为您无需特殊情况下的行首/行尾。
有没有办法为此定义自己的原子?
不幸的是,我不知道。也许您最好的选择是:
cnoreabbrev <something> \S\@<!
cnoreabbrev <something> \S\@!
值得注意的是,这些将匹配空行,而\<\>
将不匹配。这就是您要换一个较短的正则表达式的原因。