2014-07-11 4 views
2

У меня есть эта строка:регулярного выражения получить строку между двумя строками

# userid name uniqueid connected ping loss state rate 
# 529 2 "arioch83" STEAM_1:0:86796179 55:58 99 0 active 80000 
# 619 3 "Snake" STEAM_1:0:27678629 06:42 61 0 active 80000 
# 622 4 "Captain_Selleri" STEAM_1:1:47927314 03:25 44 0 active 80000 
# 583 5 "krN[786]" STEAM_1:1:14638235 28:53 53 0 active 128000 
# 621 6 "Giack" STEAM_1:1:67468100 04:44 129 0 active 80000 
# 326 7 "Urkrass" STEAM_1:0:55150382 3:02:31 51 0 active 80000 
#613 "Vinny" BOT active 
# 584 9 "Tkappa" STEAM_1:0:32266787 27:55 360 0 active 80000 
# 605 10 "Narpok19" STEAM_1:0:44838130 14:36 67 0 active 80000 
# 551 11 "robbetto83" STEAM_1:1:63675894 50:10 86 0 active 80000 
# 530 12 "XxKazuyaxX" STEAM_1:0:18676379 55:57 68 0 active 80000 
# 623 13 "beut3d - Keyser Söze" STEAM_1:0:14500718 00:29 70 0 active 80000 
# 602 15 "Homroy" STEAM_1:1:7870901 16:34 169 0 active 80000 
# 607 16 "[Bloody]Eagle" STEAM_1:1:59567346 09:14 77 0 active 80000 
#615 "Jeff" BOT active 
# 587 18 "Heisenberg" STEAM_1:1:61427218 25:15 81 0 active 80000 
#end 

И я хочу, чтобы получить строку между «# именем Идентификатор_пользователя UniqueID связана потерей пинга скоростью состояния» и «#End». Я tryied несколько регулярных выражений на основе того, что я нашел на StackOverflow, но никто не работает :( Вот моя последняя попытка

var matches = text.match(/# userid name uniqueid connected ping loss state rate(.+)\&#end/); 
       if (matches.length > 1) { 
        alert(matches[1]); 
       } 

Как вы можете видеть, что я ничего не знаю о регулярных выражениях ... ничего хорошего Tuto о тех?

спасибо,

+0

Для чего вы ищете? Пожалуйста, объясните немного больше. – Braj

+1

[игрушка] (http://regex101.com/#javascript), [руководство] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions), [a clue] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) – mechalynx

ответ

5

Вы должны быть в состоянии соответствовать по нескольким линиям. Вы ищете (dotall) модификатор s. к сожалению, этот модификатор не существует в JavaScript. Обычное решение является replacin г точка . со следующим:

[\S\s]  

Таким образом, вы можете использовать следующее регулярное выражение:

/# userid name uniqueid connected ping loss state rate([\S\s]*?)#end/ 

Объяснение:

(    # group and capture to \1: 
    [\S\s]*?  # any character of: 
       # non-whitespace (all but \n, \r, \t, \f, and " "), 
       # whitespace (\n, \r, \t, \f, and " ") 
       # (0 or more times matching the least amount possible) 
)    # end of \1 

JavaScript Demo

+0

мы можем использовать '[\ W \ w] * и' [\ D \ d] * 'также. Хороший ответ. – Braj

+0

Вы также должны использовать '[^] *'. – lrn

+0

Есть много способов, да, как я сказал «Общепринятое обходное решение ...» – hwnd

0

Альтернативой используя обычный ex pressions, чтобы разбить строку на \n и извлечь ту часть, которую вы хотите (все, от второй линии на второй до последней строки):

var contents = "your contents here..."; 

var contentArray = contents.split("\n"); 

// extract the array elements from the second to the second from last and re-join with `\n` 
console.log(contentArray.slice(1, contentArray.length - 2).join("\n")); 
0

Получить все строки, не созданные #userid и #end

/^(?!#\s*(userid|end)).*/gmi 

Online demo

0

Вы можете использовать этот шаблон, который использует тот факт, что «#end» находится в начале строки:

/# userid name uniqueid connected ping loss state rate\n((?:.*\n)*?)#end/ 

Но другой эффективный способ состоит в том, чтобы разбить журнал на строки и посмотреть начальную и конечную строки в результирующем списке.

Смежные вопросы