有没有可能编写一个正则表达式来返回所需结果的相反结果?正则表达式通常是包含查找匹配的。我希望能够将正则表达式转换为它的对立面--断言没有匹配。这个是可能的吗?如果是这样的话,是怎么做的?
http://zijab.blogspot.com/2008/09/finding-opposite-of-regular-expression.html声明您应该用括号表示正则表达式
/^((?!^ MYREGEX ).)*$/,但这似乎不起作用。如果我有正则表达式
/[a|b]./,字符串"abc“对于我的正则表达式和zijab建议的反向表达式都返回false,
/^((?!^[a|b].).)*$/。有没有可能写一个正则表达式的逆向表达式,或者我的想法是错误的?
发布于 2009-05-12 21:21:31
倒置正则表达式不起作用的原因是因为负向前视中的'^‘:
/^((?!^[ab].).)*$/
^ # WRONG在vim中可能有所不同,但在我熟悉的每种regex风格中,插入符号都匹配字符串的开头(或者在多行模式下匹配一行的开头)。但我认为这只是博客文章中的一个打字错误。
您还需要考虑您正在使用的regex工具的语义。例如,在Perl中,这是真的:
"abc" =~ /[ab]./但在Java中,这不是:
"abc".matches("[ab].")这是因为传递给matches()方法的正则表达式隐式地锚定在两端(即/^[ab].$/)。
采用更常见的Perl语义,/[ab]./意味着目标字符串包含一个由'a‘或'b’后跟至少一个(非行分隔符)字符组成的序列。换句话说,在任何时候,条件都是真的。这句话的反面是,在每个点上条件都是假的。这意味着,在使用每个字符之前,您需要执行一个负向先行检查,以确认该字符不是匹配序列的开始:
(?![ab].).而且您必须检查每个字符,因此regex必须在两端都锚定:
/^(?:(?![ab].).)*$/这是一般的想法,但我认为不可能颠倒每个正则表达式--当原始正则表达式可以包括正向和负向环视、不情愿和所有关系的量词以及谁知道什么时就不可能了。
发布于 2009-05-12 02:34:18
你就不能检查一下有没有匹配的吗?我不知道您使用的是什么语言,但是这个伪代码怎么样?
if (!'Some String'.match(someRegularExpression))
// do something...如果您只能更改正则表达式,那么从您的链接获得的regex应该可以工作:
/^((?!REGULAR_EXPRESSION_HERE).)*$/发布于 2009-05-12 19:02:13
您可以通过在开头编写^ ([^…])来反转字符集。因此,[ab]的相反表达式(匹配a或b)是[^ab] (既不匹配a也不匹配b)。
但是,表达式越复杂,互补表达式也就越复杂。举个例子:
您希望匹配文字foo。除了包含foo的字符串之外,与其他任何内容都不匹配的表达式必须与
foo短的字符串(^.{0,2}$),或foo字符串(^([^f]..|f[^o].|fo[^o])$),或总而言之,这可能是可行的:
^[^fo]*(f+($|[^o]|o($|[^fo]*)))*$但请注意:这只适用于foo。
https://stackoverflow.com/questions/850907
复制相似问题