我有以下原始字符串:
# Original strings
js/main_dev.js # This one is just to check for false positives
js/blog/foo.js
js/blog/foo.min.js
我想在每一个上运行替换正则表达式并最终得到:
# Desired result
js/main_dev.js
js/blog/foo_dev.js
js/blog/foo_dev.min.js
所以基本上,如果_dev
存在.min.js
,那么在.js
之前添加js/blog
。这应仅适用于以js/calculator
或.js
开头并以(js\/(?:blog|calculators)\/.+)(\.min\.js)$
结尾的字符串。
我最初开始使用$1_dev$2
作为正则表达式,然后.min.js
作为替换。这适用于我的第三个字符串,但显然不是我的第二个字符串,因为我“很难”寻找.min
。所以我认为我可以将?
选为(js\/(?:blog|calculators)\/.+)((?:\.min)?\.js)$
,并将其js/main_dev.js # Good
js/blog/foo_dev.js # Good
js/blog/foo.min_dev.js # Bad! _dev should be before the .min
放入非捕获群组中,如下所示:(\.min\.js|\.js)
。现在这适用于我的第二个字符串,但我的第三个字符串完全没有问题:
data-bind='source: sourceObject'
我已经尝试了很多这方面的排列,包括简单地执行data-text-field='optionText'
,但无济于事,所有这些都会产生相同的行为。这是一个带有“坏”正则表达式的正则表达式101粘贴:https://regex101.com/r/bH3yP6/1
我在这里做错了什么?
答案 0 :(得分:6)
尝试在第一组(非捕获组)末尾的?
之后抛出+
以使其变得懒惰(非贪婪):
(js\/(?:blog|calculators)\/.+?)((?:\.min)?\.js)$
(?:\.min)?
是可选的,.+
是贪婪的,因此.+
正在抓取.min
。