是否有可能编写一个返回所需结果的正则表达式?正则表达式通常是包容性的 - 找到匹配.我希望能够将正则表达式转换为相反的 - 断言没有匹配.这可能吗?如果是这样,怎么样?
http://zijab.blogspot.com/2008/09/finding-opposite-of-regular-expression.html声明你应该用你的正则表达式括起来
/^((?!^ MYREGEX ).)*$/
,但这似乎不起作用.如果我有正则表达式
/[a|b]./
,字符串"abc"返回false,我的正则表达式和zijab建议的converse,
/^((?!^[a|b].).)*$/
.是否可以编写正则表达式的反转,或者我是否正在思考错误?
难道你不能检查一下是否没有匹配?我不知道你使用的语言是什么,但这个伪代码怎么样?
if (!'Some String'.match(someRegularExpression)) // do something...
如果您只能更改正则表达式,那么您从链接获得的正则表达式应该可以正常工作:
/^((?!REGULAR_EXPRESSION_HERE).)*$/
你的倒置正则表达式不起作用的原因是因为^
"负面前瞻内部":
/^((?!^[ab].).)*$/ ^ # WRONG
也许它在vim中有所不同,但在我熟悉的每种正则表达式中,插入符号匹配字符串的开头(或多行模式中的行的开头).但我认为这只是博客文章中的一个错字.
您还需要考虑正在使用的正则表达式工具的语义.例如,在Perl中,这是真的:
"abc" =~ /[ab]./
但在Java中,这不是:
"abc".matches("[ab].")
那是因为传递给matches()
方法的正则表达式隐含地锚定在两端(即/^[ab].$/
).
采用更常见的Perl语义,/[ab]./
意味着目标字符串包含由"a"或"b"组成的序列,后跟至少一个(非行分隔符)字符.换句话说,在任何时候,条件为TRUE.该语句的反转是,在每个点上条件为FALSE.这意味着,在使用每个字符之前,执行否定前瞻以确认该字符不是匹配序列的开头:
(?![ab].).
而且你必须检查每个角色,所以正则表达式必须锚定在两端:
/^(?:(?![ab].).)*$/
这是一般的想法,但我认为不可能反转每一个正则表达式 - 不是在原始正则表达式可以包括正面和负面的外观,不情愿和占有量词,以及谁知道什么的时候.
您可以通过^
在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
.