/ / scala regex, aby sa zhodovali slová oddelené od tabu ky od re azca - regex, scala, match

scala regex, aby zodpovedali tabulkám oddeleným slovám od reťazca - regex, scala, match

Snažím sa porovnať nasledujúci reťazec

"name     type       this is a comment"

Meno a typ sú určite tam. Komentár môže alebo nemusí existovať. Snažím sa to uložiť do premenných n, ta c.

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

To je to, čo mám, ale zdá sa, že nefunguje. Cení sa akejkoľvek pomoci.

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

Toto však funguje, keď som sa snažil pracovať s reťazcami iba s menom a typom a bez komentára, čo je skupina slov, ktorá tam môže alebo nemusí byť.

odpovede:

0 pre odpoveď č. 1

Poznač si to ^(w+s+){2}(?:[w+s*)*(,,]+) regex obsahuje iba 1 zachytávajúcu skupinu ((w+s+)), zatiaľ čo v match blok.

Na ^(w+)s+([w)(,]+) obsahuje iba 2 zachytávajúce skupiny: (w+) a ([w)(,]+).

Aby váš kód fungoval, musíte definovať 3zachytávajúce skupiny. Tiež nie je jasné, čo sú oddeľovače, dovoľte mi predpokladať, že prvé dve polia sú iba 1 alebo viac alfanumerických / podčiarkovacích symbolov oddelených 1 alebo viacerými medzerami. Komentár je niečo po 2 prvých poliach.

Potom použite

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

Pozrite si online demo

Všimnite si, že musíme zostaviť regulárny objekt, dávajte pozor na .r po regulárnom vzore nameType.

Všimnite si, že vzor vnútri match je kotvená štandardne je to začiatok kotvy strún ^ možno vynechať.

Je tiež dobré pridať case _ na definovanie správania, keď sa nenájde žiadna zhoda.