3 Stimmen

Aufteilung von Zeichenkettendaten in ein Array basierend auf einer neuen Zeile und einer zweistelligen Zahl

Was ich zu tun suche, ist Daten aus String in ein Array aufgeteilt.

Hier ist die allgemeine Idee des Textformats...

xxxxx steht für eine beliebige Mischung aus alphanumerischen Daten und Leerzeichen.

xxxxx
 1 xxxxxxxxxx
 2 xxxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxx
 3 xxxxxxxxxx
 4 xxxxxxxxxx
xxxxxxxxxx
 5 xxxxxxxxxx

(Wenn Zahlen zweistellig werden, wird die Zehnerstelle in die leere Position vor der Zahl gesetzt)

Nun möchte ich ein Array mit 5 Elementen haben (in diesem Fall), das die Nummer und alle Daten speichert, die nachziehen (einschließlich der neuen Zeilen). In der Vergangenheit war dies keine große Sache und ich konnte Folgendes verwenden string.split("\n") , aber jetzt muss ich auf der Grundlage einer Art Regex abgrenzen, wie /\n [0-9]{1,2}/ so ich bin auf der Suche nach einem schnellen und einfachen Weg, dies zu tun (wie split() nicht unterstützt Regex).

Ich möchte, dass das Array wie folgt aussieht

array[1] = " 1 xxxxxxxxxx"
array[2] = " 2 xxxxxxxxxxx\nxxxxxxxxxx\nxxxxxxxxxx"
array[3] = " 3 xxxxxxxxxx"
...etc

5voto

Alan Moore Punkte 70949

split() tut unterstützen Regexe. Versuchen Sie dies:

text.split(/\n(?=[1-9 ][0-9] )/)

2voto

polygenelubricants Punkte 362173

Sie können lookahead und split on verwenden (?= [1-9] |[1-9][0-9] ) vielleicht am Anfang einer Zeile verankert, aber es kann zu Problemen mit Mehrdeutigkeiten in der xxxx Teil. Damit ist auch nicht sichergestellt, dass die Nummerierung fortlaufend ist.

Exemple

var text =
  "preface\n" +
  " 1 intro\n" +
  " 2 body\n" +
  "more body\n" +
  " 3 stuff\n" +
  "more stuff\n" +
  "even 4 stuff\n" +
  "10 conclusion\n" +
  "13 appendix\n";

print(text.split(/^(?= [1-9] |[1-9][0-9] )/m));

Die Ausgabe lautet ( wie auf ideone.com gesehen ):

preface
, 1 intro
, 2 body
more body
, 3 stuff
more stuff
even 4 stuff
,10 conclusion
,13 appendix

1voto

Nate Pinchot Punkte 3268

Wie @polygenelubricants sagte, könnten Sie eine Regex mit replace verwenden und ein Zwischentrennzeichen erstellen, dann auf dieses Trennzeichen aufteilen und es entfernen.

Hier ist ein funktionierendes Beispiel aus der Zeichenkette, die Sie oben angegeben haben, und ein weiteres, das ich zum Testen der Funktion erstellt habe. Es funktioniert mit beiden. Da Sie keine realen Daten für ein Beispiel zur Verfügung gestellt haben, kann ich das nicht testen, aber hoffentlich bringt Sie das zumindest auf die richtige Spur.

function SplitCrazyString(str) {
    var regex = /(\n\s?\d+\s[^(\n\s?\d+)]+)/mg;

    var tempStr = str.replace(regex, "~$1");

    var ary = tempStr.split('~');

    for (var i = 0; i < ary.length; i++) {
        ary[i].replace('~', '');
    }

    return ary;
}
var x = "xxxxx\n" +
    " 1 xxxxxxxxxx\n" +
    " 2 xxxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxxx\n" +
    "xxxxxxxx\n" +
    " 3 xxxxxxxxxx\n" +
    " 4 xxxxxxxxxx\n" +
    "xxxxxxxxxx\n" +
    " 5 xxxxxxxxxx\n";
var testStr = "6daf sdf84 as96\n" +
    " 1 sfs 4a8dfa sf4asf\n" +
    " 2 s85 d418 df4 89 f8f\n" +
    "65a1 sdfa48 asdf61\n" +
    "w1c 987a w1ec\n" +
    "a6s85 d1a6f 81sf\n" +
    " 3 woi567 34ewn23 5cwe6\n" +
    " 4 s6k 8hf6 9gd\n" +
    "axxm4x1 dsf615g9 8asdf1jt gsdf8as\n" +
    " 5 n389h c8j923hdha 8h3x982qh\n";

var xAry = SplitCrazyString(x);
var testAry = SplitCrazyString(testStr);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X