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

时间:2016-08-30 19:18:53

标签: 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

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

# 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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

尝试在第一组(非捕获组)末尾的?之后抛出+以使其变得懒惰(非贪婪):

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

(?:\.min)?是可选的,.+是贪婪的,因此.+正在抓取.min

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