Я ищу общую конструкцию регулярного выражения, чтобы соответствовать всему в шаблоне x, ИСКЛЮЧИТЬ совпадения с шаблоном y. Это трудно объяснить как полностью, так и кратко ... формальное определение см. Материальная неявность .
Например, сопоставить любой символ слова (\w
), КРОМЕ «p». Обратите внимание, что я вычитаю небольшой набор (буква «р») из большего набора (все символы слова). Я не могу просто сказать [^p]
, потому что это не учитывает больший ограничивающий набор только символов слова. Конечно, для этого небольшого примера я мог бы вручную реконструировать что-то вроде [a-oq-zA-OQ-Z0-9_]
, что было бы больно, но выполнимо. Но я ищу более общую конструкцию, чтобы по крайней мере большой положительный набор мог быть более сложным выражением. Как и в случае совпадения ((?<=(so|me|^))big(com?pl{1,3}ex([pA]t{2}ern)
, за исключением случаев, когда оно начинается с «My».
Редактировать : Я понимаю, что это был плохой пример, так как исключение вещей в начале или в конце - это ситуация, когда работают отрицательные прогнозные выражения и прогнозные выражения. (Богемный, я все же дал вам голос за иллюстрацию). Итак ... как насчет исключения совпадений, которые содержат "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();
}
Я ВСЕГДА просто задаюсь вопросом, есть ли нативная конструкция регулярного выражения, которая могла бы сделать это.