首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式相反

正则表达式相反
EN

Stack Overflow用户
提问于 2009-05-12 02:29:35
回答 7查看 77.7K关注 0票数 31

有没有可能编写一个正则表达式来返回所需结果的相反结果?正则表达式通常是包含查找匹配的。我希望能够将正则表达式转换为它的对立面--断言没有匹配。这个是可能的吗?如果是这样的话,是怎么做的?

http://zijab.blogspot.com/2008/09/finding-opposite-of-regular-expression.html声明您应该用括号表示正则表达式

代码语言:javascript
复制
/^((?!^ MYREGEX ).)*$/

,但这似乎不起作用。如果我有正则表达式

代码语言:javascript
复制
/[a|b]./

,字符串"abc“对于我的正则表达式和zijab建议的反向表达式都返回false,

代码语言:javascript
复制
/^((?!^[a|b].).)*$/

。有没有可能写一个正则表达式的逆向表达式,或者我的想法是错误的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-05-12 21:21:31

倒置正则表达式不起作用的原因是因为负向前视中的'^‘:

代码语言:javascript
复制
/^((?!^[ab].).)*$/
      ^            # WRONG

在vim中可能有所不同,但在我熟悉的每种regex风格中,插入符号都匹配字符串的开头(或者在多行模式下匹配一行的开头)。但我认为这只是博客文章中的一个打字错误。

您还需要考虑您正在使用的regex工具的语义。例如,在Perl中,这是真的:

代码语言:javascript
复制
"abc" =~ /[ab]./

但在Java中,这不是:

代码语言:javascript
复制
"abc".matches("[ab].")

这是因为传递给matches()方法的正则表达式隐式地锚定在两端(即/^[ab].$/)。

采用更常见的Perl语义,/[ab]./意味着目标字符串包含一个由'a‘或'b’后跟至少一个(非行分隔符)字符组成的序列。换句话说,在任何时候,条件都是真的。这句话的反面是,在每个点上条件都是假的。这意味着,在使用每个字符之前,您需要执行一个负向先行检查,以确认该字符不是匹配序列的开始:

代码语言:javascript
复制
(?![ab].).

而且您必须检查每个字符,因此regex必须在两端都锚定:

代码语言:javascript
复制
/^(?:(?![ab].).)*$/

这是一般的想法,但我认为不可能颠倒每个正则表达式--当原始正则表达式可以包括正向和负向环视、不情愿和所有关系的量词以及谁知道什么时就不可能了。

票数 10
EN

Stack Overflow用户

发布于 2009-05-12 02:34:18

你就不能检查一下有没有匹配的吗?我不知道您使用的是什么语言,但是这个伪代码怎么样?

代码语言:javascript
复制
if (!'Some String'.match(someRegularExpression))
    // do something...

如果您只能更改正则表达式,那么从您的链接获得的regex应该可以工作:

代码语言:javascript
复制
/^((?!REGULAR_EXPRESSION_HERE).)*$/
票数 13
EN

Stack Overflow用户

发布于 2009-05-12 19:02:13

您可以通过在开头编写^ ([^…])来反转字符集。因此,[ab]的相反表达式(匹配ab)是[^ab] (既不匹配a也不匹配b)。

但是,表达式越复杂,互补表达式也就越复杂。举个例子:

您希望匹配文字foo。除了包含foo的字符串之外,与其他任何内容都不匹配的表达式必须与

  1. 任何比foo短的字符串(^.{0,2}$),或
  2. 任何三个字符的非foo字符串(^([^f]..|f[^o].|fo[^o])$),或
  3. 任何不包含code的更长字符串

总而言之,这可能是可行的:

代码语言:javascript
复制
^[^fo]*(f+($|[^o]|o($|[^fo]*)))*$

但请注意:这只适用于foo

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/850907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档