Je me demande s'il est possible d'obtenir le matchdata généré à partir de l'expression régulière correspondante dans la grammaire ci-dessous.
object DateParser extends JavaTokenParsers { .... val dateLiteral = """(\d{4}[-/])?(\d\d[-/])?(\d\d)""".r ^^ { ... get MatchData } }
4 Réponses :
Lorsqu'une regex est utilisée dans une instance REGEXPARSERSERSERS, la Comme il se trouve (dans la source 2.7 que j'ai regardé), vous n'avez pas de chance, je crois. p>
Non, vous ne pouvez pas faire cela. Si vous regardez la définition de l'analyseur utilisé lorsque vous convertissez une regex à un analyseur, il lance tout contexte et renvoie simplement la chaîne correspondante complète:
Vous avez deux Autres options, cependant: p>
le premier ressemblerait à p> le Le < code>? code> signifie que l'analyseur est facultatif et retournera une option. p> Le bit <~ code> signifie "nécessite ces deux jetons ensemble, mais ne me donnez que le Résultat du premier. P>
~ code> signifie "nécessite ces deux jetons ensemble et les attache ensemble dans un objet fixable par motif. p>
.getorelse code> offre une valeur par défaut pour le moment où l'analyseur n'a pas défini un valeur. p> p>
Merci David, belle solution. Je vais aller avec la solution d'analyse personnalisée car elle maintient la définition de la grammaire plus lisible.
Maintenant que j'y pense, un analyseur personnalisé est également plus correct. Chaque analgésique de Regex autorise la tête de l'espace de tête, de sorte que le code que j'ai affiché correspondrait également aux chaînes telles que "1999 - 02 - 28".
Voici la définition implicite qui convertit votre il suffit de l'adapter: p> < Pré> xxx pré> exemple: p> regex code> dans un
parser code>:
C'est étrangement pourquoi une telle sorte de fonctionnalité ne fait pas partie de la mise en œuvre de la classe standard (Bibliothèque)? Il semble assez utile, mais chaque utilisateur doit la mettre en œuvre par soi ...
@DMitryBespalov On peut simplement appliquer le motif à nouveau pour extraire des groupes et utiliser plutôt une grammaire que des règles de regex plus complexes. Donc, oui, cela pourrait être utile, mais ce n'est pas nécessaire, et il y a de graves inconvénients dans une bibliothèque gonflée.
On sait que Lexing est plus efficace avec une regex avec une analyse conventionnelle. Entre-temps, Lexer avec RegureParsers donne Object Lexer hérite de type membre conflictuel ELEM dans des scanners de trait et des refroidisseurs CODE> et je ne peux pas ne pas étendre les réégyts car il définit la fonction
manuiste code>.
J'ai couru dans un problème similaire à l'aide de Scala 2.8.1 et essaye d'analyser l'entrée du formulaire "Nom: Valeur" à l'aide de la catégorie code> Regexparsers Code> Classe:
QueryParser.parseItem("nameExample:valueExample") match { case QueryParser.Success(result:scala.util.parsing.combinator.Parsers$$tilde, _) => { println("Name: " + result.productElement(0) + " value: " + result.productElement(1)) } }