2016-09-01 1 views
0

Grundsätzlich habe ich versäumt, ein Array so zu erstellen, wie ich es will, Was denkst du ist die beste Methode, um ein Array zu erstellen, um alle regexp Übereinstimmungen zu finden, die gefunden werden? Kannst du mir ein Beispiel zeigen?Javascript nodejs & arrays

Hier ist ein Beispiel für die Ausgabe:

die von einer Variablen namens msg geben wird

ID name ping Snap updt dist Posi

765611981281 nameexampple1 #### 600 0 0

765611981281 #### nameexampple2 31 0 0

765611981281 nameexampple3 #### 41 0 0

Grundsätzlich möchte ich Captures zu Array übereinstimmen und ausgeben, so dass nur die ID/Name/Ping-Zeilen einzeln in einem Array-Index indiziert werden, die ich später mit der Regex-Gruppe wie Arraylist [2] .highping [2 aufrufen kann ] und das würde ausgeben (nameexample2, weil es die zweite Zeile der arraylist ist), da highping regex group 2 der Benutzername für dieses Capture ist.

//RegExp 
var pingchecker = new RegExp(/^([0-9]{0,17}).+?(\w+).+?([0-9].+).+?([0-9]).+?([0-9])/m); //set to multi line 

//Finds RegExp of id name ping etc from msg which is the live feed to rcon 
if (/^id.+?name.+?ping.+?snap.+?updt.+?posi.+?dist/.test(msg)) { 
    console.log('PING CHECKER - Passing to Conditional'); 

//Finds RegExp of pingchecker from msg which is the live feed to rcon 
    if((highping = pingchecker.exec(msg))) { 
    console.log('SteamID: ' + highping[1] + ' PlayerName: ' + highping[2] + ' Ping: ' + highping[3]) //outputs one player as normal. 
    } 

} 

Macht dies für irgendjemanden Sinn? Gehe ich falsch herum? Im Grunde brauche ich Zeiger, der obige Code wird nur zum Beispiel von der ersten gefundenen Übereinstimmung ausgegeben.

+2

Ich denke, dass Sie Ihre Frage von Hand verbessern können, die erwartete Arrayausgabe errichtend. Die Beschreibung in reinem Text kann verwirrend sein. –

+1

ja, ein Beispiel für die erwartete Ausgabe geht ein langer Weg, um zu helfen –

+0

Vielen Dank für Kommentare, aber scheint jemand bereits mein Problem für mich bereits gelöst. Vielen Dank für Ihre Antworten, wenn ich das nächste Mal posten werde. – DougvF

Antwort

0

I denken Sie suchen nach etwas wie dem folgenden Code. Es wird jedes Übereinstimmungs-Array in ein Array von Übereinstimmungen setzen, so dass Sie später mit der Regex-Gruppe "anrufen" können.

Änderungen:

  1. Ändern der pingchecker RegExp zu match globally using /g. Dies ermöglicht es, mehr als nur einmal in der Zeichenfolge übereinzustimmen.
  2. Ändern Sie if zu while so it loops through finding all matches statt nur die erste.
  3. Fügen Sie die Variable resultArray hinzu, um die Ergebnisse so zu speichern, wie in der Frage "output captures to array" angefordert, damit Sie "später mit der Regex-Gruppe" anrufen können.
  4. Verschieben Sie console.log() in eine separate resultsArray.forEach()-Schleife, um zu demonstrieren, dass die resultsArray ausgefüllt wurde.

var msg= `id name ping snap updt posi dist 
 

 
765611981281#### nameexampple1 600 0 0 
 

 
765611981281#### nameexampple2 31 0 0 
 

 
765611981281#### nameexampple3 41 0 0`; 
 
    
 
//RegExp (multi line and global) 
 
var pingchecker = new RegExp(/^([0-9]{0,17}).+?(\w+).+?([0-9].+).+?([0-9]).+?([0-9])/mg); 
 
var resultArray =[]; 
 

 
//Finds RegExp of id name ping etc from msg which is the live feed to rcon 
 
if (/^id.+?name.+?ping.+?snap.+?updt.+?posi.+?dist/.test(msg)) { 
 
    console.log('PING CHECKER - Passing to Conditional'); 
 

 
    //Finds RegExp of pingchecker from msg which is the live feed to rcon 
 
    //Loop through all matches, adding them to the OP requested resultsArray 
 
    while(highping = pingchecker.exec(msg)) { 
 
     resultArray.push(highping); 
 
    } 
 
} 
 

 
//Loop through resultsArray and output the matches 
 
resultArray.forEach(function(result){ 
 
    //output player 
 
    console.log('SteamID: ' + result[1] + ' PlayerName: ' + result[2] 
 
       + ' Ping: ' + result[3]); 
 
});

+1

Erklären Sie, was Sie geändert haben und warum. – Barmar

+0

@Makyen Es ist keine gute Idee, das Start-Assertion-Zeichen von der ersten Regex zu entfernen, da es möglicherweise mit einer falschen Nachricht übereinstimmt. Und besser Template-Literale für 'msg' verwenden. –

+0

@ SoftwareEngineer171, Sie haben Recht. Das wurde vom ersten Durchlauf an selbst erstellt, indem die 'msg'-Variable erzeugt wurde. Als ich zurückging und die Zeilenumbrüche in diese Variable einfügte, änderte ich das nicht. Ich stimme zu, dass es wünschenswert ist, nach dem Newline zu entsprechen. – Makyen

0

Sie müssen die Ausführung regex wiederholen, bis der letzte Spieler erreichen. Ersetzen Sie if durch while (sonst erhalten Sie nur den ersten Spieler). Außerdem müssen Sie den globalen Regex-Modifikator unter pingchecker hinzufügen.

var msg = `id name ping snap updt posi dist 

765611981281#### nameexampple1 600 0 0 

765611981281#### nameexampple2 31 0 0 

765611981281#### nameexampple3 41 0 0`; 

//RegExp 
var pingchecker = new RegExp(/^([0-9]{0,17}).+?(\w+).+?([0-9].+).+?([0-9]).+?([0-9])/mg); //set to multi line 

//Finds RegExp of id name ping etc from msg which is the live feed to rcon 
if (/^id.+?name.+?ping.+?snap.+?updt.+?posi.+?dist/.test(msg)) { 
    console.log('PING CHECKER - Passing to Conditional'); 


//Finds RegExp of pingchecker from msg which is the live feed to rcon 
    while((highping = pingchecker.exec(msg))) { 
    console.log('SteamID: ' + highping[1] + ' PlayerName: ' + highping[2] + ' Ping: ' + highping[3]) //outputs one player as normal. 
    } 

}