November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags

October 3rd, 2013

dil: (Default)
Thursday, October 3rd, 2013 09:29 pm

чтобы её решить. Теперь у вас две проблемы.”

Это воистину так. Понадобилось мне получить список всех групп пользователя. Ну, запускаем id, он говорит что-то типа:
$ id foo
uid=1000(foo) gid=1000(foo) groups=1000(foo),4(adm),24(cdrom),25(floppy),27(sudo),29(audio),44(video)
и т.д.

Пишем регулярное выражение:
r'^uid=\d+.*? groups=\d+\(([^)]+)\)(?:,\d+\(([^)]+)\))*$'

И.. с удивлением обнаруживаем, что оно находит только первую и последнюю группу. Ну про первую понятно, для неё отдельная пара скобок есть, а вот почему вторая пара с модификатором * находит только последнюю группу — непонятно..

Пробуем заменить * на, например, {2}, теперь оно находит первую и третью группу. {5}, соответственно, первую и шестую, и т.д.

В конце концов гугление показало, что это не баг, а фича. Каждая найденное совпадение для повторяющейся группы затирает предыдущее. Только в .NET и в шестом перле, говорят, можно получить все сразу.

В результате пришлось использовать два регулярных выражения, первое вытаскивает полный список групп, второе поштучно извлекает из него отдельные названия..

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.