【问题标题】:Regex Search/Replace is... inverted正则表达式搜索/替换是......倒置
【发布时间】:2018-04-03 02:25:28
【问题描述】:

直到几天前,我的 Sublime text 3 运行良好。我也可以搜索/替换常规字符串并使用正则表达式模式,当捕获组匹配时,所有这些都被完美地突出显示。

但是,从昨天开始,我搜索的所有内容都在匹配...相反。这里:

image:\s*"?(.*?)"?

这应该匹配一个固定字符串 image,后跟一个冒号、任意数量的空格(如果有的话)以及可选引号之间的任何内容。

没什么大不了的,对吧?但是 Sublime 正在捕获字符串 image 而不是我定义的要捕获的字符串。即使没有空格或引号,它至少应该匹配冒号之后的内容,而不是之前的内容:

我进行了全新安装,重新安装并重新配置了我使用的极少数插件,试图摆脱任何类型的缓存,但没有运气。

这对我来说是一个重大挫折,因为我无法在整个项目中进行批量替换。

与我的常规开发程序相比,我只做了两件事:

  • 安装 String 2 Lower Hyphen Plugin 以加快创建一些虚线分隔的 URI 段,但在全新安装时我没有将其添加回来,问题仍然存在。
  • 我第一次使用表达式 <open files> 在我手动打开的一组特定文件中进行批量替换,因为它们位于不同的目录中。

仅此而已。

我可以通过将.*? 更改为.* 来解决此问题,但这是一种缓解措施,因为我一直使用非贪婪版本没有问题

有人知道会发生什么吗?

【问题讨论】:

    标签: sublimetext3


    【解决方案1】:

    我不确定你的正则表达式过去的匹配方式有何不同,让我们想想正则表达式在说什么:

    • image: - 文字 image:
    • \s* - 任意数量的空格,包括无
    • "? - 可选报价
    • (.*?) - 懒惰地将除换行符之外的任何内容捕获到捕获组 1 中
    • "? 可选报价

    因此,要匹配您的示例文本,它匹配image: 及其后面的空格,然后,没有引号,下一条指令是惰性的,因此它没有捕获任何内容到捕获组 1,然后没有引号,所以这就是比赛的全部内容。

    如果您总是想在捕获组 1 中捕获值,无论它是带引号的字符串还是不带引号的字符串,您都可以考虑使用如下表达式:

    \bimage:\s*"?((?(?<=")[^"]*|.*$))"?
    

    • \b 单词边界,忽略 image: 不是单词的开头
    • image: 文字 image:
    • \s* 任意数量的空格,包括无(根据您的源文档和要求,指定文字空格可能会更好/更具防御性,以便此处不会匹配换行符)
    • "?可选报价
    • ( 开始捕获组 1
      • (?(?&lt;=") 有条件的 - 向后看以查看报价是否匹配
      • [^"]* 如果引号匹配,则匹配所有非引号字符(当然,如果您的文件是 YAML 格式或类似格式,我们也可以检查转义引号,但 URL 不应包含引号,因此我们将其排除在外根据原始正则表达式。)
      • | 否则,如果条件不匹配,即image: 后面没有引号
      • .*$ 匹配所有内容,直到换行 - 同样,如果这是 YAML,您可能需要考虑排除 cmets 等。
      • ) 条件结束
      • )结束捕获组
    • "? 可选引号(如果条件失败,这将永远不会匹配 $

    【讨论】:

    • 所以我确实必须使用贪心量词。这很奇怪,因为它总是与不贪婪的人一起工作。也许已经解决了这个问题。不太可能,但谁知道呢。您比我预期的要走得更远,但感谢您的回答。 :)
    猜你喜欢
    • 2019-11-03
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2018-05-25
    • 2011-07-09
    相关资源
    最近更新 更多