Próbuję uchwycić części wielo-liniowy ciąg z regex w Scala. wejściowy ma postać:Scala Regex wielokrotnego blokowania przechwytywanie
val input = """some text
|begin {
| content to extract
| content to extract
|}
|some text
|begin {
| other content to extract
|}
|some text""".stripMargin
Próbowałem kilka możliwości, które powinny zrozumcie mnie tekst spośród begin {
}
bloków. Jeden z nich:
val Block = """(?s).*begin \{(.*)\}""".r
input match {
case Block(content) => println(content)
case _ => println("NO MATCH")
}
Dostaję NO MATCH
. Jeśli upuszczę \}
, regex wygląda jak (?s).*begin \{(.*)
i pasuje do ostatniego bloku zawierającego niechciany }
i "jakiś tekst". Sprawdziłem moje wyrażenie na rubular.com jak w przypadku /.*begin \{(.*)\}/m
i pasuje co najmniej jeden blok. Pomyślałem, że gdy moje regex Scala będzie pasować tak samo, mogę zacząć używać findAllIn
, aby dopasować wszystkie bloki. Co ja robię źle?
Spojrzałem na Scala Regex enable Multiline option, ale nie udało mi się przechwycić wszystkich wystąpień bloków tekstu, na przykład Seq[String]
. Każda pomoc jest doceniana.
Czy wiesz, że jest to udokumentowane w dowolnym miejscu? –
Dziękuję Danielowi za szczegółową odpowiedź. Działa jak marzenie. –
Alex, w tym momencie nie jestem pewien. Zrobiłem tak wiele z Regeksem, nawet rozszerzając bibliotekę, że nawet nie pamiętam, co zapewnia biblioteka, czy nie! Na przykład miałem zamiar napisać 'Block inputAllMatchesIn input map (_ group 0)', gdy odkryłem, że ta metoda nie istnieje w obecnej bibliotece. –