如何在 JavaScript 中反转正则表达式?

IT技术 javascript regex invert
2021-02-02 18:20:59

我有一个字符串 A 并且想测试另一个字符串 B 是否不是它的一部分。这是一个非常简单的正则表达式,其结果可以在之后反转。

我可以做:

/foobar/.test('foobar@bar.de')

然后将其反转,如下所示:

!(/foobar/).test('foobar@bar.de') 

我遇到的问题是,我需要在正则表达式中而不是在结果中进行。就像是:

/!foobar/.test('foobar@bar.de')

(这不起作用)

换句话说:正则表达式应该测试不存在并在这种情况下返回 true。

这可以用 JavaScript 实现吗?

4个回答

尝试:

/^(?!.*foobar)/.test('foobar@bar.de')

一个(简短的)解释:

^          # start of the string 
(?!        # start negative look-ahead
  .*       # zero or more characters of any kind (except line terminators)
  foobar   # foobar
)          # end negative look-ahead

因此,在简单的英语中,如果可以“看到”字符串 'foobar',则该正则表达式将从字符串的开头开始查找。如果可以“看到”,则没有* 匹配。

* 不匹配,因为它是前瞻!

更多关于这个先行的东西:http://www.regular-expressions.info/lookaround.html但要注意的JavaScript仅支持查找aheads,没有look-屁股

我希望每次我在 JS 中编写正则表达式时,JavaScript 都支持类似 perl 的正则表达式注释。
2021-03-16 18:20:59
很好 - 你能解释一下吗?
2021-04-02 18:20:59
我从未见过?!前。很好的答案
2021-04-02 18:20:59
太好了,这正是我需要的。之前没有在 JavaScript 中尝试过负前瞻。非常感谢!
2021-04-05 18:20:59
+1 我正在寻找您的正则表达式帖子以进行投票 - 这似乎是合适的帖子,因为它涉及环顾四周。再次感谢。
2021-04-11 18:20:59
^(?!.*(word1|word2|word3))

将匹配不包含任何的字符串word1word2word3(并可以无限期延长该列表)。但这也匹配空字符串。拒绝空值使用

^(?!$)(?!.*(word1|word2|word3))  

这是一个不等式的例子。首先我隔离运算符“<”,然后是操作数“a”和“b”。基本上,我采用直接表达式,将其包含在右括号中,用 '^' 反转后者,最后将结果表达式嵌入方括号中,'因为开头的 '^' 会被不同地解释。

var _str = "a < b" ;
var _op = /</g ;
var _no_op = /[^(<|\ )]/g ;
console.log( _str, _str.match( _op ) ); // get '<'
console.log( _str, _str.match( _no_op ) ); // get 'a', 'b'

Ps:我只是在逆表达式中添加了空格,以便检索操作数的精确匹配。

如果您真正要搜索的内容并不比像“foobar”这样的简单字符串更复杂:

if (yourString.indexOf("foobar") === -1) {
  // ...
}

http://www.w3schools.com/jsref/jsref_indexOf.asp

谢谢,但它需要是一个正则表达式,我只是稍微简化了这个例子。
2021-03-24 18:20:59
或 yourString.includes("foobar") :)
2021-04-04 18:20:59