Cette question peut sembler stupide, mais j'ai eu une longue discussion avec certains de mes collègues développeurs et cela m'a semblé être une chose amusante à envisager.
Alors, qu'en pensez-vous ? A quoi ressemble une Regex qui ne correspondra jamais à une chaîne de caractères, jamais !
Modifier : Pourquoi je veux ça ? Eh bien, d'abord parce que je trouve intéressant de penser à une telle expression et ensuite parce que j'en ai besoin pour un script.
Dans ce script, je définis un dictionnaire comme étant Dictionary<string, Regex>
. Celui-ci contient, comme vous le voyez, une chaîne de caractères et une expression.
Sur la base de ce dictionnaire, je crée des méthodes qui utilisent toutes ce dictionnaire comme seule référence sur la manière dont elles doivent effectuer leur travail. L'une d'entre elles fait correspondre les regex à un fichier journal analysé.
Si une expression est trouvée, une autre Dictionary<string, long>
est ajouté une valeur qui est retournée par l'expression. Donc, pour attraper tous les messages de log qui ne correspondent pas à une expression dans le dictionnaire, j'ai créé un nouveau groupe appelé "inconnu".
On ajoute à ce groupe tout ce qui ne correspond à rien d'autre. Mais pour éviter que l'expression "inconnue" ne corresponde pas (par accident) à un message de journal, j'ai dû créer une expression qui ne correspondra certainement jamais, quelle que soit la chaîne que je lui donne.
Ainsi, vous avez ma raison pour cette "pas une vraie question"...
1 votes
Notez qu'il est très difficile de prouver une négation.
0 votes
Wow, apparemment amusant signifie autre chose pour moi que pour les trois personnes qui ont rétrogradé ma réponse avant que je ne la supprime. Tu as raison, revenons aux choses sérieuses.
0 votes
Je ne pense pas qu'il aurait dû être fermé, mais je ne veux pas voter pour sa réouverture sans quelques informations de base.
0 votes
Eh bien, comme vous le voyez : "Pas une vraie question"... je n'en sais pas plus car c'était une vraie question dont j'avais besoin pour un projet...
0 votes
@ApoY2k si vous spécifiez le cas d'utilisation, il pourrait être rouvert.
0 votes
Je vais essayer, mais c'est quand même assez spécifique...
0 votes
Regex n'est pas le même en phyton / javascript / php / autre, donc dans quel langage essayez-vous de l'utiliser ?
0 votes
Indiquez également la langue dans le titre et les balises, afin que l'on puisse vous aider plus facilement.
5 votes
Intéressant. Où utiliseriez-vous une telle regex ?
1 votes
Yoda, comme mentionné ci-dessus, j'utilise Python et Javascript, mais je ne veux pas limiter les réponses à ces seuls langages. Je serais heureux d'examiner les solutions dans d'autres syntaxes, et je crois que je pourrais porter la solution assez facilement. Oui, les différents langages ne sont pas identiques, mais ils sont assez proches dans ce domaine, 9 fois sur 10.
1 votes
Charlie, le cas d'utilisation le plus récent est celui où je construis une regex de manière programmatique, avec des groupes comme (foo|bar|baz) construits à partir d'entrées externes. Je veux que tous les groupes soient présents, mais certains peuvent ne pas avoir d'entrée externe et ne doivent donc jamais correspondre. Si je ne fais rien, j'aurai des groupes vides de () qui, au moins en Python, correspondent entre chaque caractère. Je veux que tous les groupes soient présents pour qu'un appel à regex.sub() avec une routine de rappel effectuant le remplacement puisse être simplifié, à la fois pour la lisibilité et pour les performances dans une boucle.
1 votes
Cette question a été posée stackoverflow.com/questions/1723182/
0 votes
Pourquoi le
complexity
étiquette ? Je ne vois pas comment elle s'applique ici.3 votes
Je tiens à préciser que bon nombre des commentaires ci-dessus, ainsi que les réponses à cette question, proviennent à l'origine de stackoverflow.com/questions/1845078/ ce qui est une question que j'ai posée. Marc Gravell les a fusionnées, ce qui, à mon avis, rend beaucoup de ces réponses un peu bizarres sans le contexte original précis, au point que certains commentaires ne semblent pas avoir de sens. (Je dirais que des questions avec des contextes aussi détaillés ne pourraient jamais être des "duplicatas exacts". Peu importe...
0 votes
Il y a une autre raison d'utiliser ceci, spécifique à perl : c'est quelque chose à mettre d'un côté de la construction conditionnelle de la regex si l'un des résultats que vous voulez est "ne pas correspondre du tout". par ex.
s/(?(?{ defined $ENV{FOO} })foo|(*F))/bar/g
, "remplacez bar par foo si $FOO, sinon ne faites rien".3 votes
Cette question a été ajoutée à la FAQ sur les expressions régulières de Stack Overflow sous la rubrique "Advanced Regex-Fu".
1 votes
@CharlieSalts : J'en ai besoin parce que j'ai une classe qui capture toutes les lignes d'entrée en commençant par la ligne correspondant à la regex 1, et en terminant par celle correspondant à la regex 2. Si la regex 2 est impossible à faire correspondre, cela leur permet d'obtenir todos lignes après la ligne de départ. Un peu comme le
{min,max}
y{min,}
les quantificateurs de regex.7 votes
"Notez qu'il est très difficile de prouver une négation" - c'est une idée largement répandue mais totalement fausse... comme nous le savons au moins depuis qu'Euclide a prouvé qu'il n'y a pas de plus grand nombre premier. Et toute preuve de P est une preuve de la négation de (pas P). Ce qui est vrai, c'est qu'il est difficile de prouver un universel empirique, positif ou négatif, par exemple, "tous les corbeaux sont noirs" ou "aucun corbeau n'est blanc". Les algorithmes sont analytiques, et non empiriques, et il s'agit donc d'une mauvaise application de la règle du faux. Par exemple, il n'est pas "très difficile" de prouver que le motif "a" ne correspond à aucune chaîne commençant par "b".
0 votes
" ^.{0}$ ", je pense que ce serait probablement la seule expression capable de ne jamais correspondre à quoi que ce soit. En raison du simple fait que si elle a la possibilité de correspondre à quelque chose, cela signifie également qu'il n'y a rien à correspondre.
0 votes
Encore mieux et plus simple que celui-là. ` ^{0} ` Aucune erreur de syntaxe invalide et même si vous ajoutiez un caractère quelconque à la fin, cela n'aurait aucune importance. ` ^{0}.* ` avec ou sans ancrage $ à la fin.