Zerlegt eine Zeichenkette in eine Liste, aber halten Sie die split-Muster
Derzeit bin ich splitten eines string-Muster, wie hier:
outcome_array=the_text.split(pattern_to_split_by)
Das problem ist, dass die Muster selbst, dass ich split durch, bekommt immer weggelassen.
Wie bekomme ich bei der split-Muster selbst?
- Sie möchten, speichern Sie die beiden Zeichenfolgen , die aufgeteilt ein und unsplitted ist, dass das, was Sie suchen?
- Wo wollen Sie beinhalten die Muster? innerhalb der Zeichenfolge?
- ich will die split-Muster zurück, wie gut.. innerhalb der Zeichenfolge.
- Könnte Sie geben beispielsweise input-und output?
- Warum würden Sie sich
'split it '
split von'here and '
? - Eingabe = "split es hier und hier okay", splitter = 'hier'. würde die Ausbeute Ausgabe = ['split ', 'hier und ', 'hier okay]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielen Dank an Mark Wilkins für inpsiration, aber hier ist eine kürzere bit-code, es zu tun:
oder:
Siehe weiter unten für eine Erklärung.
Hier ist, wie diese funktioniert. Zuerst teilten wir uns auf "auf", sondern wickeln Sie es in Klammern, um es in einer übereinstimmungsgruppe ist. Wenn es eine übereinstimmung gibt Gruppe im regulären Ausdruck übergeben
split
Ruby gehören, die Gruppe in der Ausgabe:Nun wollen wir verbinden jede Instanz von "on" mit der vorstehenden Zeichenfolge an.
each_slice(2)
hilft, indem Sie zwei Elemente zu einem Zeitpunkt auf seinen block. Lasst uns einfach aufrufeneach_slice(2)
zu sehen, welche Ergebnisse. Daeach_slice
, wenn Sie angerufen werden, ohne einen block, gibt einen enumerator, wir wendento_a
auf den Zähler, so dass wir sehen können, was der Enumerator wird enumerator über:Sind wir immer in der Nähe. Alles was wir jetzt tun müssen ist, verbinden Sie die Wörter zusammen. Und das bringt uns der Lösung oben. Ich werde es Auspacken in einzelne Linien zu machen, es leichter zu Folgen:
Aber gibt es eine nette Weise zu beseitigen, die temporäre
b
und verkürzen den code erheblich:map
übergibt jedes element der Eingabe-array, um den block; das Ergebnis der Sperrung wird das neue element an dieser position im Ausgabe-array. Bei MRI >= 1.8.7, kürzen kann man es noch mehr zu den äquivalenten:Könntest du einen regulären Ausdruck verwenden assertion suchen Sie den split-Punkt, ohne konsumieren des Eingangs. Unten wird eine positive look-behind assertion split nur nach 'on':
Oder eine positive look-ahead-split kurz vor 'auf':
Mit so etwas wie diesem, möchten Sie vielleicht, um sicherzustellen, 'on' war nicht Teil eines größeren Wortes vorhanden (z.B. 'assertion'), und auch das entfernen von Leerzeichen am split:
Wenn Sie ein Muster mit Gruppen, wird es wieder das Muster in den Ergebnissen als auch:
Bearbeiten Die zusätzliche information angegeben, dass das Ziel ist, den Gegenstand, auf dem es aufgeteilt wurde, mit einer der Hälften der split-Objekte. Ich würde denken, es ist ein einfacher Weg, das zu tun, aber ich kenne es nicht und hatte noch keine Zeit, heute zu spielen. So in der Abwesenheit von der cleveren Lösung, im folgenden wird ein Weg, um brute-force-it. Verwenden Sie die
split
Methode, wie oben beschrieben, umfassen die geteilten Elemente im array. Dann das array Durchlaufen und verbinden jeden zweiten Eintrag (der ist per definition die split-Wert) mit dem vorherigen Eintrag.Ergebnisse, in: