2016-09-01 2 views
0

В принципе, мне не удалось создать массив так, как я его хочу. Как вы думаете, лучший метод для создания массива для вывода всех найденных совпадений регулярных выражений? Не могли бы вы показать мне пример?Javascript nodejs & arrays

Вот пример вывода: который передается из переменной называется сообщ

имя Идентификатор пинг оснастке UPdt Позитив DIST

765611981281 #### nameexampple1 600 0 0

765611981281 #### nameexampple2 31 0 0

765611981281 #### nameexampple3 41 0 0

В принципе, я хочу совместить и выводить захваты в массив, поэтому только индексы ID/Name/Ping индексируются каждый по отдельности внутри индекса массива, который я могу вызвать позже с группой регулярных выражений, такой как arraylist [2] .highping [2 ], и это будет выводить (nameexample2, потому что его вторая строка arraylist) как группа regex высокого уровня 2 является именем пользователя для этого захвата.

//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. 
    } 

} 

Это имеет смысл для всех? Я собираюсь сделать это неправильно? В основном мне нужны указатели, выше кода выводится только первый найденный совпадение, например.

+2

Я думаю, вы можете улучшить свой вопрос вручную, построив ожидаемый вывод массива. Описать его в чистом тексте может сбивать с толку. –

+1

да, пример ожидаемого выхода идет долгий путь, чтобы помочь –

+0

Спасибо за комментарии, но, похоже, кто-то уже решил мою проблему для меня уже. Спасибо за ваши ответы, если учесть это в следующий раз, когда я отправляю сообщение. – DougvF

ответ

0

I думаю вы ищете что-то вроде следующего кода. Он поместит каждый массив соответствий в массив совпадений, чтобы вы могли «позже позвонить с группой регулярных выражений».

Изменения:

  1. Изменить pingchecker RegExp в match globally using /g. Это позволяет ему совместить больше, чем один раз в строке.
  2. Изменить if на while so it loops through finding all matches вместо первого.
  3. Добавить переменную resultArray, чтобы сохранить результаты, поэтому, как указано в вопросе, «output capture to array», чтобы вы могли «позже позвонить с группой регулярных выражений».
  4. Переместить console.log() в отдельный цикл resultsArray.forEach(), чтобы продемонстрировать, что был заполнен resultsArray.

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

Объясните, что вы изменили и почему. – Barmar

+0

@Makyen Не рекомендуется удалять символ начала начала из первого регулярного выражения, поскольку он может совпадать с неправильным сообщением. И лучше использовать шаблонные литералы для 'msg'. –

+0

@ SoftwareEngineer171, Вы правы. Это было оставлено с первого прохода при самосоздании переменной 'msg'. Когда я вернулся и вставил новые строки в этой переменной, я не изменил это. Я согласен с тем, что желательно после матча. – Makyen

0

Вы должны повторить выполняющийся регулярное выражение, пока не дойдете до последнего игрока. Замените if на while (иначе вы получите только первого игрока). Кроме того, вам нужно добавить глобальный модификатор regex на ваш pingchecker.

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. 
    } 

}