J'utilise une expression régulière pour correspondre à une correspondance de motif, mais je veux aussi savoir quand il échoue. P>
Par exemple, disons que j'ai un modèle de "n {1,3} y". Je le fais correspond à la chaîne "Nnnny". J'aimerais savoir que cela a échoué parce qu'il y avait trop de NS. Ou si je le fais correspond à la chaîne "xnny", je voudrais savoir qu'il a échoué parce qu'un caractère non valide "x" était dans la chaîne. P>
En regardant l'API d'expression régulière Java (Java.Util.regex), des informations supplémentaires ne semblent être disponibles que dans la classe de correspondance lorsque la correspondance réussit. P>
Y a-t-il un moyen de résoudre ce problème? Ou est une expression régulière même une option dans ce scénario? P>
4 Réponses :
Ce que vous demandez nécessiterait que l'analyseur détermine une chaîne à proximité qui correspond à votre expression. Il s'agit d'un problème non trivial qui fonctionnerait probablement dans une période exponentielle (par exemple, recherchez toutes les chaînes possibles de longueur similaire pour trouver une correspondance.) P>
Donc, en bref, non. p>
Je suppose que vous devriez utiliser un analyseur, plutôt que de simples expressions régulières. p>
Les expressions régulières sont bonnes fournissant des allumettes pour la chaîne, mais pas tout à fait pour fournir des non-matchs, sans parler d'expliquer pourquoi un match a échoué. P>
Merci, je pensais avoir besoin d'un parser. Je suppose que cela le confirme.
-1 Je pense que ce n'est pas une réponse, mais un bon commentaire. Les expressions régulières vont bien, il vous suffit de comprendre ce que la classe de correspondance peut vous donner.
Cela peut fonctionner mais je ne sais pas si c'est ainsi que vous en avez besoin.
Lorsque vous utilisez code> correspondant code>, il échoue si la séquence entière ne correspond pas, mais vous pouvez toujours utiliser sortie: p> dans la première sortie: Voici une autre sortie p> < Pré> xxx pré> Le motif est là, mais toute l'expression ne correspondait pas. P> C'est un peu difficile de comprendre comment trouver, des allumettes et de la vue à la recherche de la doc (au moins cela est arrivé à moi) mais j'espère que cet exemple vous aide à comprendre. p> correspondance est comme lookat est comme P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> Trouver est comme J'espère que cela aide. p> p> trouver code> pour voir si le reste de la séquence contenait le motif. Et ainsi comprendre pourquoi il a échoué: p> n [nnny ] code> vous pouvez en dire là où trop de N, dans la seconde: x [NNY] code> Il y avait un X présent. p> / ^ votrepatternHere $ / code> p> / ^ votrepatternhere / code> p> / votrepatternhere / code> p>
Pour des expressions simples comme "N {1,3} y", vous trouverez la solution sans outil vous-même. Mais pour des expressions plus compliquées, mon expérience suggère: P>
Je ne connais aucun moteur de regex qui fournit cette information lors de la correspondance.
Ce n'est pas possible. Une chaîne peut ne pas correspondre à de nombreuses raisons différentes. Et, de toute façon, aucun moteur ne le fait.
C'est une sorte de question ouverte de pourquoi quelque chose ne correspondait pas. Vous pouvez définir des expressions régulières qui correspondent à des situations spécifiques qui sont "non correspondantes" mais une réponse générale n'est pas possible. Pourquoi "Abcdef" ne correspond-il pas? C'est la mauvaise longueur, il n'a pas de caractères «n», il ne se termine pas dans Y, il est minuscule, etc.
Une regex est conçue pour trouver rapidement et efficacement des motifs. Votre exigence n'a rien à voir avec la recherche de matchs, mais plus avec l'analyse des intrants. Vous pouvez résoudre celui-ci avec un motif Xustom ou un ensemble de regex, pour chaque cas d'erreur séparé.