/ / scala regex, aby dopasować słowa oddzielone tabulatorami od łańcucha - regex, scala, match

scala regex dopasowuje oddzielone tabulatorami słowa z ciągu - regex, scala, match

Próbuję dopasować następujący ciąg

"name     type       this is a comment"

Nazwa i typ są zdecydowanie dostępne. Komentarz może istnieć lub nie. Próbuję zapisać to w zmiennych n, t i c.

val nameTypeComment    = """^(w+s+){2}(?:[w+s*)*(,,]+)"""
str match { case nameType(n, t, c) => print(n,t,c) }

To właśnie mam, ale wydaje się, że nie działa. Każda pomoc jest doceniana.

val nameType    = """^(w+)s+([w)(,]+)""".r

Działa to jednak, gdy próbowałem pracować z ciągami tylko z nazwą i typem i bez komentarza, który jest grupą słów, które mogą tam być lub nie.

Odpowiedzi:

0 dla odpowiedzi № 1

Zauważ, że ^(w+s+){2}(?:[w+s*)*(,,]+) regex zawiera tylko 1 grupę przechwytującą ((w+s+)) podczas definiowania 3 w match blok.

The ^(w+)s+([w)(,]+) zawiera tylko 2 grupy przechwytywania: (w+) i ([w)(,]+).

Aby kod działał, musisz zdefiniować 3przechwytywanie grup. Ponadto nie jest jasne, jakie są separatory, załóżmy, że pierwsze dwa pola to tylko 1 lub więcej symboli alfanumerycznych / podkreślników oddzielonych 1 lub więcej białymi spacjami. Komentarz jest dowolny po 2 pierwszych polach.

Następnie użyj

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")
}

Zobacz wersja online

Zauważ, że musimy skompilować obiekt wyrażenia regularnego, zwróć uwagę na .r po wzorcu wyrażenia regularnego nameType.

Zauważ, że wzór w środku match jest zakotwiczony domyślnie początek zakotwiczenia łańcucha ^ można pominąć.

Warto też dodać case _ aby zdefiniować zachowanie, gdy nie znaleziono dopasowania.