Javascript 仅当模式中不存在字符串时才匹配模式的正则表达式

Javascript 仅当模式中不存在字符串时才匹配模式的正则表达式,javascript,regex,regex-negation,regex-lookarounds,regex-greedy,Javascript,Regex,Regex Negation,Regex Lookarounds,Regex Greedy,一直在寻找一个典型场景的正则表达式。不确定如何在正则表达式中实现这一点 Regex ---> (?is)[^:]\/\/ Payload ---> Regexp,test//check//last:// Matches ---> t// and k// 问题:仅当测试字符串以“data:image”(如下所示)开头时,我需要修改上述正则表达式以忽略//的匹配 在上述情况下,它不应该与我的条件匹配(匹配/),因为测试字符串以“data:image”开头 建议修改上述正则表达式的

一直在寻找一个典型场景的正则表达式。不确定如何在正则表达式中实现这一点

Regex ---> (?is)[^:]\/\/
Payload ---> Regexp,test//check//last://
Matches ---> t// and k//
问题:仅当测试字符串以“data:image”(如下所示)开头时,我需要修改上述正则表达式以忽略//的匹配

在上述情况下,它不应该与我的条件匹配(匹配/),因为测试字符串以“data:image”开头


建议修改上述正则表达式的方法,以便我们能够处理此情况

如果我正确理解了您的问题,您希望正则表达式匹配您的模式
/
和前面不应该是
的字符:
。只有当测试字符串不是以
data:image
开头时,才应该进行匹配

/(?!data:image)(?:.*?)([^:]\/\/)/giy
  • (?!data:image)
    确保字符串不以data:image开头
  • (?:.*)
    非捕获非贪婪匹配
  • ([^:::\/\/)
    您的匹配项
    /
    和前面不应该是
    的字符:
  • /y
    表示粘性匹配,以便仅从上一个匹配结束的位置进行匹配。这样,对于以
    data:image
    开头的字符串,它将不匹配任何内容
var regex=/(?!数据:图像)(?:.*)([^:::\/\/)/giy
//这不应该匹配,因为测试字符串以data:image开头
var payload=“data:image/png;base64,test//check//last://”;
var match=regex.exec(有效负载);
控制台日志(匹配);
//这应该会找到匹配项,因为负载不是以data:image开头的
var anotherpayload=“Regexp,test//check//last://”;
match=regex.exec(另一个有效负载);
while(匹配!=null){
//访问组1
console.log(匹配[1])
match=regex.exec(另一个有效负载);

}
如果我正确理解了您的问题,您希望正则表达式匹配您的模式
/
和前面不应该是
的字符:
。只有当测试字符串不是以
data:image
开头时,才应该进行匹配

/(?!data:image)(?:.*?)([^:]\/\/)/giy
  • (?!data:image)
    确保字符串不以data:image开头
  • (?:.*)
    非捕获非贪婪匹配
  • ([^:::\/\/)
    您的匹配项
    /
    和前面不应该是
    的字符:
  • /y
    表示粘性匹配,以便仅从上一个匹配结束的位置进行匹配。这样,对于以
    data:image
    开头的字符串,它将不匹配任何内容
var regex=/(?!数据:图像)(?:.*)([^:::\/\/)/giy
//这不应该匹配,因为测试字符串以data:image开头
var payload=“data:image/png;base64,test//check//last://”;
var match=regex.exec(有效负载);
控制台日志(匹配);
//这应该会找到匹配项,因为负载不是以data:image开头的
var anotherpayload=“Regexp,test//check//last://”;
match=regex.exec(另一个有效负载);
while(匹配!=null){
//访问组1
console.log(匹配[1])
match=regex.exec(另一个有效负载);

}
检查字符串是否以值开头。无论如何,您不能使用
(?因为JS正则表达式引擎不支持无限宽度lookbehinds。您需要每个负载中的所有匹配项作为输出吗?是的,我需要找到所有模式,然后消除它们。但我不想仅当负载以“data:image”开头时才执行此操作(我的意思是在第二种情况下,我不希望出现模式匹配)。尝试实现某种“如果不匹配,那么匹配”怎么样:
/(?!data:image)(?:*?)([^::\/\/)/giy
?检查字符串是否首先以值开头。无论如何,不能使用
(?因为JS正则表达式引擎不支持无限宽度lookbehinds。是否需要每个负载中的所有匹配作为输出?是的,我需要找到所有模式,然后消除它们。但我不希望仅当负载以“data:image”开头时才执行此操作(我的意思是在第二种情况下,我不希望出现模式匹配)。试图实现某种“不匹配”的效果,比如:
/(?!data:image)(?:*?)([^:::\/\/)/giy
?非常感谢!它确实有效。但我没有完全弄清楚它是如何工作的。到底为什么(?:*?)这里需要,以及它是如何使用粘性“y”标志的?请提供更多输入或我可以参考的任何文档链接。再次感谢!当然。您可以使用这些演示:和。
(?:
表示非捕获组,
*?
仅用于匹配任何字符(非贪婪)。粘性标志告诉引擎从上一次匹配结束的位置继续匹配。这样,如果字符串以
data:image
开头,那么它就不匹配任何内容。它在客户端和javascript引擎上运行良好。但是在服务器端,我使用Java模式类,在编译时我将在下面介绍错误。这与java8相同。您可以建议任何解决方案/备选方案以使此工作正常。Pattern.compile(regExp)上的异常:java.util.regex.PatternSyntaxException:索引4附近未知的内联修饰符(?isy)(?!data:image)(?:.*)([^://)非常感谢!它确实有效。但我没有完全弄清楚它是如何工作的。为什么这里需要(?:*)以及它是如何使用粘性“y”标志的?请提供更多输入或我可以参考的任何文档链接。再次感谢!当然。您可以使用这些演示:和。
(?:
表示非捕获组,
*?
仅用于匹配任何字符(非贪婪)。粘性标志告诉引擎从上一次匹配结束的位置继续匹配。这样,如果字符串以
data:image
开头,那么它就不匹配任何内容。它在客户端和javascript引擎上运行良好。但是在服务器端,我使用Java模式类,在编译时我将在下面介绍错误。这与java8相同。您可以建议任何解决方案/替代方案以使此工作正常。Pattern.compile(regExp)上的异常:java.ut