J'essaie de faire correspondre la chaîne suivante
"name type this is a comment"
Le nom et le type sont définitivement là. Les commentaires peuvent ou non exister. J'essaie de stocker cela dans les variables n, t et c.
val nameTypeComment = """^(w+s+){2}(?:[w+s*)*(,,]+)"""
str match { case nameType(n, t, c) => print(n,t,c) }
C’est ce que j’ai mais ne semble pas fonctionner. Toute aide est appréciée.
val nameType = """^(w+)s+([w)(,]+)""".r
Cependant, cela fonctionne lorsque j’essayais de travailler avec des chaînes uniquement avec un nom, un type et aucun commentaire, qui est un groupe de mots pouvant y figurer ou non.
Réponses:
0 pour la réponse № 1Notez que ^(w+s+){2}(?:[w+s*)*(,,]+)
regex contient seulement 1 groupe de capture ((w+s+)
) pendant que vous définissez 3 dans le match
bloc.
le ^(w+)s+([w)(,]+)
contient seulement 2 groupes de capture: (w+)
et ([w)(,]+)
.
Pour que votre code fonctionne, vous devez définir 3capture de groupes. De plus, les séparateurs ne sont pas clairs. Supposons que les deux premiers champs ne soient qu’un ou plusieurs symboles alphanumériques / soulignés séparés par un ou plusieurs espaces. Le commentaire est n'importe quoi après 2 premiers champs.
Ensuite, utilisez
val s = "name type this comment a comment"
val nameType = """(w+)s+(w+)s+(.*)""".r
val res = s match {
case nameType(n, t, c) => print(n,t,c)
case _ => print("NONE")
}
Voir le démo en ligne
Notez que nous devons compiler un objet regex, faites attention au .r
après le motif regex nameType
.
Notez qu'un motif à l'intérieur match
est ancré par défaut, le début de l'ancre de chaîne ^
peut être omis.
Aussi, c'est une bonne idée d'ajouter case _
pour définir le comportement quand aucune correspondance n'est trouvée.