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 № 1Zauważ, ż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.