Javascript ReGEX-查找中间不包含字符串的匹配项
我正在寻找一个正则表达式,将找到一个匹配Javascript ReGEX-查找中间不包含字符串的匹配项,javascript,regex,Javascript,Regex,我正在寻找一个正则表达式,将找到一个匹配 比赛的开始是: 中间可以包含任何内容,但不能包含另一个:字符串 比赛结束时是!: 例1:Chicken:!FN油炸食品(时髦:奶酪)!:机翼 预期匹配::!FN油炸食品(时髦:奶酪)!: 例2:Chicken:!FNDepfry(:!fnSpecial({{recIngred}})!:):机翼 预期匹配::!FNSecial({{recIngred}})!: 这是我的尝试/:!([^:!]+)!:/通用汽车公司 我无法让匹配框重新识别
:代码>
:代码>字符串
!:代码>
- 例1:
Chicken:!FN油炸食品(时髦:奶酪)!:机翼
- 预期匹配:
:!FN油炸食品(时髦:奶酪)!:代码>
- 预期匹配:
- 例2:
Chicken:!FNDepfry(:!fnSpecial({{recIngred}})!:):机翼
- 预期匹配:
:!FNSecial({{recIngred}})!:代码>
- 预期匹配:
这是我的尝试<代码>/:!([^:!]+)!:/通用汽车公司 我无法让匹配框重新识别
:代码>作为字符串,而不是单个字符
在我看来,有一个足够简单的解决方案:
REGEX:
/.*:!(.*?)!:/
.*:! : Greedy [.*] select everything until last ":!" which is then followed by the rest of the regex
(.*?) : Non-greedy capture group. Captures everything until first occurrence of rest of regex
!: : End of match
Input:
Chicken :!fnDeepFry(Funky:Cheese)!: Wings
Chicken :!fnDeepFry(:!fnSpecial({{recIngred}})!:)!: Wings
Chicken :! :!fnDeepFry(:!fnSpecial({{recIngred}})!:)!: Wings
Output:
fnDeepFry(Funky:Cheese)
fnSpecial({{recIngred}})
fnSpecial({{recIngred}})
以下是我对它的看法:
:!([^!:]+(?:(?:![^:]|:[^!])[^!:]*)*)!:
它的作用是:
匹配文本值:代码>
匹配任何不是的内容代码>或a:
多次
匹配以下组的零次或多次:
(literal!
后跟任何非:
)或(literal:
后跟任何非!
)
非的任何内容的零个或多个代码>或a:
文字:代码>
这使用了一种称为。这要复杂得多,但如果您想要更好的性能,这将是一个比非贪婪限定符更好的选择
reg-exp似乎不是一个好选择,应该是一个解析器……感谢您的建议,但遗憾的是,解析器不是我的选择。我不太了解正则表达式,但我希望在字符串:!的情况下调整正则表达式使匹配无效代码>存在不会太难@你真的需要/:!((?:(?!:!).)+)!:/g
,请参阅<代码>/.*:!(.*?)!:/g
是一个正则表达式,它与模式的最后一次出现相匹配,它将无法匹配同一行中的多个正则表达式。这在我的用例中是有效的。它捕获内部函数,并通过一个简单的循环捕获其余函数。感谢您的快速回复,即将上线!