2009-05-02 120 views
2

我有一条如下所示的行。双引号括起来的字符串

fullname =(这是一个测试名称);

我想双引号“(”和“)”中的所有字符串。

即fullname =(“this”“is”“a”“test”“name”);

有人可以给我一个vim正则表达式来做到这一点吗?

回答

3

该做的:

:%s/\v(\(.*)@<=[[:alnum:]]+(.*\))@=/"&"/g 

注意,如果输入的格式不正确使用正则表达式匹配嵌套的模式(如括号)会出问题。上述内容根本不处理嵌套圆括号,括号中的引号或转义符也会将其打破。小心轻放。

其内容如下:

 
:%s    substitute on all lines 
/    matching 
\v    (with "very magic" switched on) 
(\(.*)@<=   a position that follows an opening paren, on this line 
[[:alnum:]]+  a series of alphanumeric characters (i.e. "words") 
(.*\))@=   that are followed by a closing paren, on this line 
/    replace with 
"&"    the match, in quotes 
/g    globally 

这是一个值得注意的事实是,VIM不对实际上支持可变长度向后看。大多数现代正则表达式实现不。

0

该命令使一切这是不空格,制表符,等号,括号或分号报价:

:s/[^ \t=();][^ \t=();]*/"&"/g 

请注意,此报价fullname为好,但你可以手动删除这些报价。

有时候手工完成部分工作是值得的,因为自动化会更慢。

运行命令:

:help substi 

,以获取有关vim的正则表达式替换的帮助。

+0

@pts,我想不想任何手动删除 – chappar 2009-05-02 07:55:26

+0

不工作。这将所有内容都包含在引号中。 – Tomalak 2009-05-02 07:58:47

+0

我认为它的工作原理与答案相同,我在提交答案之前已经尝试过。 “一切”是什么意思? – pts 2009-05-02 08:26:54

4

我会做如下:

:s/\<\w\+\>/"&"/gc 

由于确认开关“C”,你会被要求每次更换。 回答'n'(no)代替行的其余部分的'全名'和'a'(全部)。