Regex pour “ET PAS” l'opération

Je suis à la recherche d'un général de la regex de construire afin de correspondre avec tout le motif x, à l'EXCEPTION des matchs de patron de y. C'est difficile à expliquer à la fois complète et concise...voir Matériel Nonimplication pour une définition formelle.

Par exemple, correspond à tout caractère de mot (\w) à l'EXCEPTION de 'p'. Remarque je suis la soustraction d'un petit ensemble (la lettre 'p') à partir d'un ensemble plus large (tous les caractères de mot). Je ne peux pas juste dire [^p] parce que ne pas prendre en compte la plus grande limitation de ne caractères de mot. Pour ce petit exemple, c'est sûr, je pourrais reconstruire manuellement quelque chose comme [a-oq-zA-OQ-Z0-9_], qui est une douleur, mais faisable. Mais je suis à la recherche d'un cadre plus général de construction de sorte qu'au moins le grand ensemble positif peut être une expression plus complexe. Comme match ((?<=(so|me|^))big(com?pl{1,3}ex([pA]t{2}ern) sauf quand ça commence par "Mon".

Modifier: je me rends compte que c'était un mauvais exemple, car à l'exclusion des trucs au début ou à la fin est une situation où le négatif look-ahead et de recherche de derrière les expressions de travail. (Bohême-je encore vous a donné un upvote pour illustrer cette). Alors...à quoi au sujet de l'exclusion des matches qui contiennent "Mon" quelque part dans le milieu?...Je suis encore vraiment à la recherche d'une construction générale, comme une regex équivalent de la suite pseudo-sql

select [captures] from [input]
where (
    input MATCHES [pattern1]
    AND NOT capture MATCHES [pattern2]
)

Si la réponse est "il n'existe pas et voici pourquoi...", je voudrais savoir que trop.

Edit 2: Si je voulais définir ma propre fonction pour ce faire, il serait quelque chose comme (voici un C#, LINQ version):

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();
}

Je suis TOUJOURS demandais si il y est un natif de la regex de construire qui pourrait faire cela.

  • Peut-être que vous pourriez accepter une réponse...
  • Pas réellement répondu à la question. Ils ont tous obtenu coincé sur les détails de mon exemple, plutôt que de répondre à la question dans l'abstrait, mais complète. Les deux éditions de fournir la logique du concept clairement.
  • Pour répondre à votre édité question, la solution générale "contient et ne contient pas B" est ^(?!.*B).*A
  • Qu'est-ce que ?<=? Je n'ai jamais vu cette expression avant, mais j'ai principalement fait du JavaScript, dont l'expression régulière de la langue n'est pas très expressif.
InformationsquelleAutor Joshua Honig | 2011-09-25