使JavaScript正则表达式的一部分可选

Ale*_*pin 1 javascript regex

我有以下原始字符串:

# Original strings
js/main_dev.js # This one is just to check for false positives
js/blog/foo.js
js/blog/foo.min.js
Run Code Online (Sandbox Code Playgroud)

我想在每一个上运行替换正则表达式并最终得到:

# Desired result
js/main_dev.js
js/blog/foo_dev.js
js/blog/foo_dev.min.js
Run Code Online (Sandbox Code Playgroud)

所以基本上,如果它存在_dev之前添加.min.js,如果不存在,之前添加.js.这应该只适用于与开头的字符串js/blogjs/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
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多这方面的排列,包括简单地做(\.min\.js|\.js)但无济于事,都导致了同样的行为.这是一个带有"坏"正则表达式的Regex 101粘贴:https://regex101.com/r/bH3yP6/1

我在这做错了什么?

Joh*_*ohn 6

尝试在第一组(非捕获组)结束?后抛出一个+以使其变得懒惰(非贪婪):

(js\/(?:blog|calculators)\/.+?)((?:\.min)?\.js)$

(?:\.min)?是可选的,.+是贪婪的,所以.+捕获.min.

https://regex101.com/r/bH3yP6/3