几天前,我的Sublime文本3工作得很好。我可以搜索/替换常规字符串并使用正则表达式模式,当捕获组匹配时,所有这些都被完美地突出显示。
然而,从昨天开始,我搜索的所有内容都相反......相反。这里:
image:\s*"?(.*?)"?
这应匹配固定字符串图像,后跟冒号,任意数量的空格(如果有)以及可选引号之间的任何内容。
没什么大不了的,对吧?然而,Sublime正在捕获字符串图像,而不是我定义要捕获的字符串。即使没有空格或引号,它至少应该与冒号后面的内容匹配,而不是在它之前:
我做了全新的安装,重新安装并重新配置了我使用的极少数插件,试图,可能,摆脱任何类型的缓存,没有运气。
这对我来说是一个重大挫折,因为我无法在整个项目中进行批量替换。
我做的事情与我的常规开发例程不同,只有两件事:
<open files>
在我手动打开的一组特定文件中进行批量替换,因为它们位于不同的目录中。只不过是。
我可以通过将
.*?
更改为.*
来解决此问题,但这是一种缓解措施,因为我总是使用非贪婪版本而没有问题
有谁知道会发生什么?
答案 0 :(得分:2)
我不确定你的正则表达式是如何以不同方式匹配的,让我们考虑一下正则表达式的含义:
image:
- 文字image:
\s*
- 任何数量的空白,包括无"?
- 可选引用(.*?)
- 懒惰地将除换行符之外的任何内容捕获到捕获组1 "?
可选引用因此,为了匹配您的示例文本,它匹配image:
及其后面的空格,然后,没有引号,下一条指令是懒惰的,所以它没有捕获到捕获组1,然后没有引用,这就是比赛的全部范围。
如果您始终想要捕获捕获组1中的值,无论它是带引号还是不带引号的字符串,您可以考虑使用如下表达式:
\bimage:\s*"?((?(?<=")[^"]*|.*$))"?
\b
字边界,忽略image:
不是单词的开头image:
文字image:
\s*
任意数量的空白,包括无空格(取决于您的源文档和要求,指定文字空间可能更好/更具防御性,因此此处不会匹配换行符)"?
可选引用(
开始捕获第1组
(?(?<=")
有条件 - 看后面是否匹配报价[^"]*
如果引用匹配,则匹配所有非引号字符(当然,如果您的文件是YAML格式或类似字符,我们也可以检查转义引号,但网址不应包含引号,所以我们按照原始的正则表达式将其遗弃。)|
否则,如果条件不匹配,即在image:
之后没有引用.*$
匹配所有内容直到换行符 - 再次,如果这是YAML,您可能需要考虑排除评论等。)
结束条件)
结束捕获组"?
可选引号(如果条件失败,这将永远不会在$
匹配)