/ / scala regex pour faire correspondre les mots séparés par des tabulations d'une chaîne - regex, scala, match

regex scala pour faire correspondre les mots séparés par des tabulations d'une chaîne - regex, scala, match

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 № 1

Notez 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.