例如,匹配任何单词字符(
\w
)除了'p'。请注意,我正在从一个更大的集合(所有单词字符)中减去一个小集合(字母“ p”)。我不能仅仅说[^p]
,因为它没有考虑到限制更大的集合只有单词字符。对于这个小例子,当然,我可以手动重构类似于[a-oq-zA-OQ-Z0-9_]
的东西,这是痛苦但可行的。但是我正在寻找一个更通用的结构,因此至少可以更复杂地表示大的正数集。例如,在不以“My”开头时匹配((?<=(so|me|^))big(com?pl{1,3}ex([pA]t{2}ern)
,除非以“My”开头。
编辑:我意识到那是一个糟糕的例子,因为在开头或结尾排除某些内容是负向前瞻和后瞻表达式可行的情况。(Bohemian,我仍然为你的说明点赞)。因此......如何排除包含“My”在中间的匹配?...我仍然真正寻找一个通用结构,就像以下伪SQL的正则表达式等效物。select [captures] from [input]
where (
input MATCHES [pattern1]
AND NOT capture MATCHES [pattern2]
)
如果答案是“它不存在,原因是……”,我也想知道。
编辑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();
}
我仍然在想是否有本地的正则表达式结构可以实现此功能。
^(?!.*B).*A
。 - Bohemian?<=
是什么?虽然我主要使用的是JavaScript,其正则表达式语言不太具有表现力,但我以前从未见过这个表达式。 - trysis^(?!.*B).*A.*
选择整行 - Yuri Aps