Regex 不包含字符串的正则表达式模式

Regex 不包含字符串的正则表达式模式,regex,Regex,已经有人问过了,但提问者对两个字符的答案感到满意。我重复他的基本问题: 一般来说,有没有办法,如何 假设不包含相同的字符串 我能说的方式不包含 带[^a]的字符 我想创建一个regexp,它匹配两个结束字符串以及它们之间的所有内容,但前提是在其中找不到给定字符串的其他实例但我对所引用问题的一般答案最满意 例如: 字符串是”和” 应该匹配 "<script> something something </script>" “某物” 但不是 "<script>

已经有人问过了,但提问者对两个字符的答案感到满意。我重复他的基本问题:

一般来说,有没有办法,如何 假设不包含相同的字符串 我能说的方式不包含 带[^a]的字符

我想创建一个regexp,它匹配两个结束字符串以及它们之间的所有内容,但前提是在其中找不到给定字符串的其他实例但我对所引用问题的一般答案最满意

例如:

字符串是

应该匹配

"<script> something something </script>"
“某物”
但不是

"<script> something <script> something something </script>"
“一些东西”

你读过我对那个问题的回答了吗?它给出了一个更一般的解决方案。在您的情况下,它将如下所示:

(?s)<script>(?:(?!</?script>).)*</script>
(?s)(?:(?!)*

换言之:匹配开头顺序;然后在确保不是结束序列的开始后,一次匹配一个字符;然后匹配结束顺序。

解决问题的正确表达式是

"^<script>((?!<script>).)*</script>$"
使用。Lookarounds提供零宽度匹配,这意味着它们不使用源字符串中的任何字符

var s1 = "some long string with the CENSORED word";
var s2 = "some long string without that word";
console.log(s1.match(/^(?!.*CENSORED).*$/));//no match
console.log(s2.match(/^(?!.*CENSORED).*$/));//matches the whole string

负前瞻的语法是
(?!REGEX)
。它搜索
REGEX
,如果找到匹配项,则返回false。如果找到匹配项,正向前瞻
(?=REGEX)
将返回true。

我仍然不理解括号中的内容以及它们不匹配的原因,但我会找到答案。这个正则表达式有不平衡的偏执。当我修复表达式时,它与两个字符串都不匹配。@naugtur,我修复了缺少的括号。它可能仍然不起作用,在这种情况下,开始标记和结束标记可能位于不同的行上。尝试在建议的正则表达式前面添加
(?s)
,这将使点元字符也匹配换行符:
(?s)(?:(?!)*
这是罪过!我应该测试它,即使我之前已经发布了十几次。谢谢,巴特。没问题,艾伦,看到像你这样的人也犯了这些(小)错误,我感到很欣慰!;)我对它进行了调整,输入有点不同,因此不必担心html内容。请看一看问题:您是否正在尝试解析html?如果是这样的话,你最好使用HTML解析器。不,我正在尝试过滤掉一些东西。这只是一个例子是的,我没发现。它从匹配一行开始,我一定跳过了阅读它的其余部分;)@naugtur:当您删除的内容是html时,最好使用解析器。这里有JSHTML解析器
"^START((?!foobar).)*END$"
var s1 = "some long string with the CENSORED word";
var s2 = "some long string without that word";
console.log(s1.match(/^(?!.*CENSORED).*$/));//no match
console.log(s2.match(/^(?!.*CENSORED).*$/));//matches the whole string