你能用正则表达式帮我改变
这样的行吗?<string name="Final time">Final time</string>
<string name="After extra time">After extra time</string>
到行
<string name="final_time">Final time</string>
<string name="after_extra_time">After extra time</string>
因此在双引号之间用下划线替换空格并使所有字母都小写。
我将在VIM中使用此正则表达式进行搜索/替换。
答案 0 :(得分:3)
通用方法:
:%s/\(<string name="\)\(\u\)\([^" ]\+\) \([^" ]\+\)/\1\l\2\e\3_\4/
这将替换每个字符串@name
\u
)和\([^" ]\+\) \([^" ]\+\)
)和\l\2\e
)。 要使@name小写的所有内容都可以简化:
:%s/\(<string name="\)\([^" ]\+\) \([^" ]\+\)/\1\l\2_\3_\e/
要摆脱多个空格,请执行两个步骤。首先,将属性值设为小写:
:%s/\(<string name="\)\([^"]\+\)/\1\l\2\e/
然后,用下划线
替换属性值中的每个空格:%s/\(<string name="[^"]*\)\@<= /_/g
请注意,\@<=
是vim表达积极的后视断言的方式。
答案 1 :(得分:1)
(这个答案已经过时,并没有完全回答目前提出的问题。但是,它会保留在这里,而不是根据另一位回答者的建议删除。)
如果你想要一个不能被愚弄的正则表达式,那么为什么呢?这需要一些工作。然而,在使用Vim时,人们通常会采取更放松的态度。这不起作用吗?
:s/"final time"/"final_time"/g
如果您希望替换仅发生一次,则可以省略尾随g
。另一方面,你可以成功
:s/"\cfinal time"/"final_time"/g
使模式匹配不区分大小写(但是,真的要做到这一点,请参阅@ Tomalak的回答)。
然而,在使用Vim时,可能有一种更简单的方法,如下所示。
qq
开始录制微距q
(或qa
以开始录制微距a
等等;如果不确定,qq
打字最快,和其他任何一样好。)/"\cfinal time"
,然后按enter键。f<Space>
或6l
将光标移至该空间。r_
以空格替换空格。q
完成录制宏。然后,如果您愿意,可以立即按@q
使Vim自动重复相同的操作。如果您在整个文件中分散了多个字符串"final time"
,并且都希望进行相同的编辑,则这很快且有用。更好的是,第三以及您希望Vim执行相同操作的后续时间,您只需按@@
即可重复上一次@
操作。这太快了。
(感谢@Tomalak添加/"\cfinal time"
将搜索修改为不区分大小写。我不知道。)