正则表达式搜索/替换是...倒置

时间:2017-10-22 12:32:15

标签: sublimetext3

几天前,我的Sublime文本3工作得很好。我可以搜索/替换常规字符串并使用正则表达式模式,当捕获组匹配时,所有这些都被完美地突出显示。

然而,从昨天开始,我搜索的所有内容都相反......相反。这里:

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

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

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

bug

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

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

我做的事情与我的常规开发例程不同,只有两件事:

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

只不过是。

  

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

有谁知道会发生什么?

1 个答案:

答案 0 :(得分:2)

我不确定你的正则表达式是如何以不同方式匹配的,让我们考虑一下正则表达式的含义:

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

因此,为了匹配您的示例文本,它匹配image:及其后面的空格,然后,没有引号,下一条指令是懒惰的,所以它没有捕获到捕获组1,然后没有引用,这就是比赛的全部范围。

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

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

regex

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