【问题标题】:simple regex - between double quotations replace space with underscore and make all letters lowercase简单的正则表达式 - 双引号之间用下划线替换空格并使所有字母小写
【发布时间】:2012-05-09 10:30:35
【问题描述】:

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

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

【问题讨论】:

    标签: regex vim


    【解决方案1】:

    通用方法:

    :%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
    

    请注意,\@&lt;= 是 vim 表达积极的后向断言的方式。

    【讨论】:

    • 几乎可以工作,但从 Top Scorers 行开始 Top Scorers
    • 这意味着这个正则表达式将 Top Scorers 替换为 Top Scorers 而不是 最佳射手
    • @Tomasz 如果你有多个单词(不仅仅是两个),你需要一个两步的方法:首先替换大写字母,然后是空格。
    • 工作,谢谢。这让我大吃一惊。你能让它在更通用的情况下工作吗?因此,不仅对于两个空格分隔的单词,而且对于任意数量的单词。也可以将任何大写字母替换为小写字母。
    • @Tomasz 抱歉,我无法一步处理任意数量的空格。但是,要使所有内容都小写,只需将\l 移动到替换表达式的开头,将\e 移动到末尾。 \l\e 之间的所有内容都转换为小写。 (\l\2\3_\4\e)
    【解决方案2】:

    (此答案已过时,并未完全回答当前提出的问题。但是,它保留在这里,而不是根据其他回答者的建议删除。)

    如果你想要一个不会被愚弄的正则表达式,为什么,那将需要一些工作。然而,在使用 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" 并按回车键。
    3. f&lt;Space&gt;6l 将光标移到空格上。
    4. r_ 将空格替换为下划线。
    5. q 完成宏录制。

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

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

    【讨论】:

    • @Tomalak:我承认\c 对我来说并不熟悉。另一方面,在我开始回答之后,OP似乎已经更新了问题,所以我会再看一遍,并调查\c。谢谢。
    • \c 是不区分大小写的正则表达式。你的不匹配。
    • @thb 谢谢,但我的意思是比字符串“最终时间”更通用的情况。它是关于任何字符串,有任意数量的单词。
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多