这是我的黑暗沙漠.vim:
hi Cursor guibg=#b3b3df guifg=grey30 gui=bold
hi VertSplit guibg=#505050 guifg=grey50 gui=none
hi Folded guibg=#252525 guifg=gold3
hi FoldColumn guibg=#252525 guifg=gold3
hi IncSearch guifg=slategrey dark guibg=ghost white
hi LineNr guifg=grey30
hi ModeMsg guifg=goldenrod3
hi MoreMsg guifg=SeaGreen Dark
hi NonText guifg=LightBlue guibg=#252525
hi Question guifg=#28a45c
我需要提取用英文命名的颜色,例如"浅蓝色","石板灰色深"。我的解决方案如下:
while (<DATA>) {
print $1,"n" while /(?:[bf]g=K(?!#)(.*)(?=gui))/g;
}
使用模式/[bf]g=K(?!#)(.*)(?=gui)/
,我只能在gui[bf]g=
之间获取项目。
所以我的问题是:如何匹配所有英文颜色名称?(菊科植物3,海绿...等)
您可以使用
正则表达式/gui[fb]g=([^#]+?)s+(?=w+=|z)/g
执行此操作。
下面是一些示例代码,用于演示它使用您自己的数据。
use strict;
use warnings;
while (<DATA>) {
print join ', ', map qq("$_"), /gui[fb]g=([^#]+?)s+(?=w+=|z)/g;
print "n";
}
__DATA__
hi Cursor guibg=#b3b3df guifg=grey30 gui=bold
hi VertSplit guibg=#505050 guifg=grey50 gui=none
hi Folded guibg=#252525 guifg=gold3
hi FoldColumn guibg=#252525 guifg=gold3
hi IncSearch guifg=slategrey dark guibg=ghost white
hi LineNr guifg=grey30
hi ModeMsg guifg=goldenrod3
hi MoreMsg guifg=SeaGreen Dark
hi NonText guifg=LightBlue guibg=#252525
hi Question guifg=#28a45c
输出
"grey30"
"grey50"
"gold3"
"gold3"
"slategrey dark", "ghost white"
"grey30"
"goldenrod3"
"SeaGreen Dark"
"LightBlue"
一个更明显但不是必要的更好解决方案:
use strict;
my @c; # colors
my @m; # matches
while ( <DATA> ) {
@m = /guifg=([w ]+?) *($|gui)/; # trying to extract the FG color, if exists
push(@c, $m[0]) if $m[0];
@m = /guibg=([w ]+?) *($|gui)/; # trying to extract the BG color, if exists
push(@c, $m[0]) if $m[0];
}
map { print $_, "n", } @c; # all color names are in @c, do whatever you want with them