Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помогите с регуляркой (https://javascript.ru/forum/misc/4768-pomogite-s-regulyarkojj.html)

Holod 19.08.2009 09:36

помогите с регуляркой
 
Составляю выражение для текста вида
to [Login 1] to [Login 2] произвольный текст
Блоков "to [Login]" может быть любое кол-во, в том числе 0. Нужно вытащить логины и текст сообщения.
Написал выражение
^(to \[([\w\s]*)\]\s*)*(.*)$
Если его применить к указанному тексту, результат будет такой:
0: (to [Login 1] to [Login 2] произвольный текст)
1: (to [Login 2] )
2: (Login 2)
3: (произвольный текст)
Почему в результаты попадает только второй (нас самом деле последний) блок "to [Login]"? Если выражение заменить на
^(to \[([\w\s]*)\]\s*)(to \[([\w\s]*)\]\s*)(.*)$
то есть повторить первую скобку, результат будет тем, который и нужен, но только для двух блоков.
0: (to [Login 1] to [Login 2] произвольный текст)
1: (to [Login 1] )
2: (Login 1)
3: (to [Login 2] )
4: (Login 2)
5: (произвольный текст)

Tim 19.08.2009 12:02

PHP solution:

$subject = "to [Login 1] to [Login 2] to [Login 3] to [Login 4] произвольный текст";

# Логины
preg_match_all('/(to \[([^]]+)\])+/', $subject, $matches);

foreach($matches[2] as $key => $val) print "<br>$val";


# Произвольный текст
preg_match_all('/\]([^]]*$)/', $subject, $matches);

print "<br>".$matches[1][0];


Результат:
Login 1
Login 2
Login 3
Login 4
произвольный текст


Часовой пояс GMT +3, время: 02:19.