简单的正则表达式 - 双引号之间用下划线替换空格并使所有字母小写

时间:2012-04-29 10:58:05

标签: regex vim

你能用正则表达式帮我改变

这样的行吗?
<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中使用此正则表达式进行搜索/替换。

2 个答案:

答案 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时,可能有一种更简单的方法,如下所示。

  1. qq开始录制微距q(或qa以开始录制微距a等等;如果不确定,qq打字最快,和其他任何一样好。)
  2. 键入搜索命令/"\cfinal time",然后按enter键。
  3. f<Space>6l将光标移至该空间。
  4. r_以空格替换空格。
  5. q完成录制宏。
  6. 然后,如果您愿意,可以立即按@q使Vim自动重复相同的操作。如果您在整个文件中分散了多个字符串"final time",并且都希望进行相同的编辑,则这很快且有用。更好的是,第三以及您希望Vim执行相同操作的后续时间,您只需按@@即可重复上一次@操作。这太快了。

    (感谢@Tomalak添加/"\cfinal time"将搜索修改为不区分大小写。我不知道。)