Ausgabe
Ich habe unter Scala-Funktion.
def getMatchesFor(input: String, matchId: String): List[String] = {
val regex = s"""${matchId}_\w*""".r
(regex findAllIn input).toList
}
Was ist der Erwartungswert der Funktion?
val input = "abc_1_1_1_0abc_1_0_1"
val result = getMatchesFor(input, "abc")
result
sollte seinList("abc_1_1_1_0", "abc_1_0_1")
Ich habe es bisher versucht, val r = s"${matchId}_\\w*".r
aber es funktioniert nicht wie erwartet.
Wie kann ich dieses Problem beheben?
Lösung
Hier ist eine Regex, die Ihren Anforderungen entspricht:
val regex = s"${matchId}_\\w*?((?=${matchId})|\\W|$$)".r
\w*
muss keiner gierig sein, sonst würde einfach alles passen. Es sollte nur übereinstimmen, bis gefolgt von:
- die nächste
matchId
mit einem Lookahead(?=${matchId})
- ein Nicht-Wort-Zeichen
\W
- oder das Zeilenende
$
Ein alternativer Ansatz könnte darin bestehen, die Zeichenfolge einfach mit aufzuteilen und die verbleibende Übereinstimmung aus den Teilen zu matchId
extrahieren (wobei die erste Teilung ignoriert wird)._\w*
Beantwortet von – Moritz
Antwort geprüft von – Clifford M. (FixError Volunteer)