Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ReGEX-查找中间不包含字符串的匹配项_Javascript_Regex - Fatal编程技术网

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
    是一个正则表达式,它与模式的最后一次出现相匹配,它将无法匹配同一行中的多个正则表达式。这在我的用例中是有效的。它捕获内部函数,并通过一个简单的循环捕获其余函数。感谢您的快速回复,即将上线!