如何用Vim正则仅匹配指定的多行JavaScript导入语句?
解决Vim正则仅匹配特定导入语句的问题
你的问题出在正则里用了\_.*这个组合——\_会让后面的.匹配包括换行符在内的所有字符,所以你的正则会从第一行的import开始,一直匹配到第二行的结尾,自然就选中了所有内容。
要精准匹配第二行,我们需要限制大括号内的匹配范围,不让它跨行,这里有两种可靠的写法:
1. 普通正则模式(默认)
用[^}]*替代\_.*,这个表达式会匹配除了}之外的任意字符,既不会跨行(默认.不匹配换行),又能精准捕获大括号内的内容:
/^import\s{[^}]*}\sfrom\s'../../../common/helpers/users';$
2. Very Magic模式(\v)
如果你习惯用\v简化正则(减少转义),写法类似,注意在\v模式下,{是元字符,要匹配字面量的{需要转义:
/\v^import\s\{[^}]*\}\sfrom\s'../../../common/helpers/users';$
补充:非贪婪匹配的写法
如果你偏好非贪婪匹配的思路,也可以用.\{-}(Vim中的非贪婪任意字符匹配,不跨行),效果和[^}]*一致,但[^}]*的性能更优(不需要回溯):
/^import\s{.\{-}}\sfrom\s'../../../common/helpers/users';$
用以上任意一个正则,都只会选中第二行的导入语句,不会匹配第一行。
内容的提问来源于stack exchange,提问作者Kristijan
相关产品推荐
相关产品推荐

