当前位置:  开发笔记 > 编程语言 > 正文

正则表达式相反

如何解决《正则表达式相反》经验,为你挑选了3个好方法。

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

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

/^((?!^ MYREGEX ).)*$/

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

/[a|b]./

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

/^((?!^[a|b].).)*$/

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



1> Sasha Chedyg..:

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

if (!'Some String'.match(someRegularExpression))
    // do something...

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

/^((?!REGULAR_EXPRESSION_HERE).)*$/



2> Alan Moore..:

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

/^((?!^[ab].).)*$/
      ^            # WRONG

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

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

"abc" =~ /[ab]./

但在Java中,这不是:

"abc".matches("[ab].")

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

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

(?![ab].).

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

/^(?:(?![ab].).)*$/

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



3> Gumbo..:

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

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

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

    任何比foo (^.{0,2}$)或更短的字符串

    任何三个字符长的字符串不是foo(^([^f]..|f[^o].|fo[^o])$),或

    任何不包含的字符串foo.

这一切都可能有效:

^[^fo]*(f+($|[^o]|o($|[^fo]*)))*$

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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有