【问题标题】:Regex: Find multiple matching strings in all lines正则表达式:在所有行中查找多个匹配字符串
【发布时间】:2016-01-27 23:13:45
【问题描述】:

我正在尝试使用 Sublime Text 3 中的正则表达式匹配 一行 中的多个字符串。
我想匹配所有值并将它们替换为 null.

我匹配的部分字符串:

"userName":"MyName","hiScore":50,"stuntPoints":192,"coins":200,"specialUser":false

应该匹配的字符串列表:

"MyName"
50
192
200
false

替换后的结果:

"userName":null,"hiScore":null,"stuntPoints":null,"coins":null,"specialUser":null

有没有办法在不使用 sed 或任何其他替换方法的情况下做到这一点,而只需在正则表达式中匹配所需的模式?

【问题讨论】:

    标签: regex string replace character match


    【解决方案1】:

    你可以使用这个查找模式:

    :(.*?)(,|$)
    

    这个替换模式:

    :null\2
    

    第一组将使用最后一个量词lazy(问号)匹配任何符号(点)零次或多次(星号),最后一部分意味着它将尽可能少地匹配。第二组将匹配逗号或字符串的结尾。在替换模式中,我将第一组替换为 null(根据需要),并保持与第二组匹配的符号不变。

    【讨论】:

    • 很好的答案,但问题是它在最后一次替换后留下一个逗号,我认为 OP 不会想要
    • 它不会在最后一次替换之后放置逗号,因为它只会复制它找到的符号,无论是逗号还是美元符号。我自己试过了。
    • 我很抱歉,当时我使用的正则表达式测试器坏了,对不起。
    【解决方案2】:

    这是 amaurs 答案的另一种选择,它在最后一次替换后没有放入逗号:

    :\K(.*?)(?=,|$)
    

    还有这个替换模式:

    null
    

    这与 amaurs 类似,但在找到冒号后开始匹配(使用 \K 重置匹配起点)并匹配到换行符的逗号(使用正向查找)。

    我已经测试过,这适用于 Sublime Text 2(所以应该适用于 Sublime Text 3)

    另一个稍微好一点的替代方案是:

    (?<=:).+?(?=,|$)
    

    它使用积极的lookbehind而不是重置正则表达式的起点

    另一个不错的选择(目前为止最有效的):

    :\K[^,]*
    

    【讨论】:

      【解决方案3】:

      这可能会有所帮助。

      查找:(?&lt;=:)[^,]*
      替换:null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多