3

你能帮我用一个正则表达式来改变像这样的行吗

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

4

2 回答 2

5

通用方法:

:%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 表达积极的后视断言的方式。

于 2012-04-29T11:14:49.233 回答
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完成宏录制。

然后,如果您愿意,可以立即按@q使 Vim 自动重复相同的操作。如果您"final time"的文件中有多个字符串都需要进行相同的编辑,这将非常快速且有用。更棒的是,第三次及以后你想让 Vim 做同样的操作,你可以按@@重复上一次@操作。这特别快。

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

于 2012-04-29T11:10:11.933 回答