正则表达式相反

Gre*_*reg 26 regex

是否有可能编写一个返回所需结果的正则表达式?正则表达式通常是包容性的 - 找到匹配.我希望能够将正则表达式转换为相反的 - 断言没有匹配.这可能吗?如果是这样,怎么样?

http://zijab.blogspot.com/2008/09/finding-opposite-of-regular-expression.html声明你应该用你的正则表达式括起来

/^((?!^ MYREGEX ).)*$/
Run Code Online (Sandbox Code Playgroud)

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

/[a|b]./
Run Code Online (Sandbox Code Playgroud)

,字符串"abc"返回false,我的正则表达式和zijab建议的converse,

/^((?!^[a|b].).)*$/
Run Code Online (Sandbox Code Playgroud)

.是否可以编写正则表达式的反转,或者我是否正在思考错误?

Sas*_*gov 13

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

if (!'Some String'.match(someRegularExpression))
    // do something...
Run Code Online (Sandbox Code Playgroud)

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

/^((?!REGULAR_EXPRESSION_HERE).)*$/
Run Code Online (Sandbox Code Playgroud)


Ala*_*ore 9

你的倒置正则表达式不起作用的原因是因为^"负面前瞻内部":

/^((?!^[ab].).)*$/
      ^            # WRONG
Run Code Online (Sandbox Code Playgroud)

也许它在vim中有所不同,但在我熟悉的每种正则表达式中,插入符号匹配字符串的开头(或多行模式中的行的开头).但我认为这只是博客文章中的一个错字.

您还需要考虑正在使用的正则表达式工具的语义.例如,在Perl中,这是真的:

"abc" =~ /[ab]./
Run Code Online (Sandbox Code Playgroud)

但在Java中,这不是:

"abc".matches("[ab].")
Run Code Online (Sandbox Code Playgroud)

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

采用更常见的Perl语义,/[ab]./意味着目标字符串包含由"a"或"b"组成的序列,后跟至少一个(非行分隔符)字符.换句话说,在任何时候,条件为TRUE.该语句的反转是,在每个点上条件为FALSE.这意味着,在使用每个字符之前,执行否定前瞻以确认该字符不是匹配序列的开头:

(?![ab].).
Run Code Online (Sandbox Code Playgroud)

而且你必须检查每个角色,所以正则表达式必须锚定在两端:

/^(?:(?![ab].).)*$/
Run Code Online (Sandbox Code Playgroud)

这是一般的想法,但我认为不可能反转每一个正则表达式 - 不是在原始正则表达式可以包括正面和负面的外观,不情愿和占有量词,以及谁知道什么的时候.


Gum*_*mbo 6

您可以通过^在start([^…])处写入来反转字符集.所以[ab](匹配a或者b)的相反表达式[^ab](既不匹配a也不匹配b).

但是你的表达越复杂,互补表达也就越复杂.一个例子:

你想匹配文字foo.除了包含的字符串之外的任何其他内容foo都必须匹配的表达式

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

这一切都可能有效:

^[^fo]*(f+($|[^o]|o($|[^fo]*)))*$
Run Code Online (Sandbox Code Playgroud)

但请注意:这仅适用于foo.