我正在寻找一个通用的正则表达式构造来匹配模式 x 中的所有内容,除了匹配模式 y 之外。这很难完整而简洁地解释......看实质性非暗示 http://en.wikipedia.org/wiki/Material_nonimplication以获得正式的定义。
例如,匹配任何单词字符 (\w
)除了“p”。请注意,我从一个较大的集合(所有单词字符)中减去一个较小的集合(字母“p”)。我不能只说[^p]
因为这没有考虑到更大的仅限单词字符的限制集。对于这个小例子,当然,我可以手动重建类似的东西[a-oq-zA-OQ-Z0-9_]
,这是一个痛苦但可行的方法。但我正在寻找一种更通用的构造,以便至少大的正集可以是更复杂的表达式。喜欢比赛((?<=(so|me|^))big(com?pl{1,3}ex([pA]t{2}ern)
除非以“My”开头。
Edit:我意识到这是一个不好的例子,因为在开始或结束时排除某些内容是负向前看和向后看表达式起作用的情况。 (波西米亚人我仍然为你的说明投了赞成票)。那么...排除中间某处包含“My”的匹配怎么样?...我仍然在寻找一个通用的构造,就像下面的伪sql的正则表达式等价物
select [captures] from [input]
where (
input MATCHES [pattern1]
AND NOT capture MATCHES [pattern2]
)
如果答案是“它不存在,这就是为什么......”我也想知道。
Edit 2:如果我想定义自己的函数来执行此操作,则类似于(这里是 C# LINQ 版本):
public static Match[] RegexMNI(string input,
string positivePattern,
string negativePattern) {
return (from Match m in Regex.Matches(input, positivePattern)
where !Regex.IsMatch(m.Value, negativePattern)
select m).ToArray();
}
我仍然想知道是否有一个本机正则表达式构造可以做到这一点。