【问题标题】:substitute word boundaries with vim用 vim 替换单词边界
【发布时间】:2015-10-20 04:39:47
【问题描述】:

我想将对象属性引用转换为数组,如下所示:

$stuff->a_property

进入

$stuff['a_property']

我试过了

s/->.*\>/['\0'\]/g

但它给了我

$stuff['->a_property']

【问题讨论】:

  • 你能说清楚一点吗?您是否尝试用[' 替换>,同时在末尾添加']?我认为不需要正则表达式来执行此操作,但是我不熟悉“vim”或“sed”,所以我可能错了。
  • ->word into ['word'] 为什么你认为不需要正则表达式,你会怎么做?
  • 因为听起来您想要的是替换/更改您的原始字符串。正则表达式用于搜索和捕获字符串的特定部分。该捕获的信息又可以用于替换和更改字符串 yes,但在正则表达式之外。 RegExp 不能以任何方式更改您的字符串,只能返回原始字符串的一部分。

标签: regex vim replace sed


【解决方案1】:
:s/->\zs.*\>/['\0'\]/g

也可以,从进入\0 的文本中排除->

【讨论】:

    【解决方案2】:

    您可以使用捕获组

    :%s/->\(.*\)\>/['\1'\]/
    

    \(.*\) 用于捕获-> 后的值到组#1 用于替换。这会给你$stuff['a_property']

    编辑:如果您想每行进行多次替换,请使用:

    :%s/->\(.\{-}\)\>/['\1'\]/g
    

    .\{-} 用于非贪婪匹配,而.* 用于贪婪匹配。

    【讨论】:

    • g 太多但仍然 +1
    • 没错,我进一步更新为使用非贪婪匹配,以防在同一行上进行多个替换。
    • 对于多行替换,您可以添加选项% (:%s) 除了多次出现g
    • 确实如此。我一直在使用:%s/... 进行测试
    【解决方案3】:

    表达式中的正则表达式匹配->,然后替换[] 中的整个匹配项。这就是你得到的原因

    $stuff['->a_property']
    

    @anubhava 已经发布了答案,但是我会提出另一个可能更易读的变体,使用 \v 运算符:

    :s/\v\-\>(.*)>/['\1']/g
    

    \v 表示“将模式中的所有后续字符视为特殊字符,不包括0-9a-zA-Z_”。如需更多信息,请参阅:help /\v

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多