LINUX.ORG.RU

Поймать все подшаблоны

 ,


1

1

Допустим есть у меня некоторое неизвестное заранее регулярное выражение и строка, в которую надо подставить все совпадения из этой регулярки по индексам. К примеру:

set str "l:12:a41:low-roze"
set rgxp "^l:([0-9]+):([0-9a-z]+):low-([a-z]+)"
set result "nui=$1 an_dg=$2 run=$3"

...

# тут result должен быть таким "nui=12 an_dg=a41 run=roze"
Как? Имеется ввиду как это сделать красиво и быстро, а не вообще как. Всякие разборы в циклах городить не хочется. Ограничивать $rgxp в количестве подшаблонов тоже нельзя. Можно конечно написать что-то типа:
set str "l:12:a41:low-roze"
set rgxp "^l:([0-9]+):([0-9a-z]+):low-([a-z]+)"
set result "nui=$1 an_dg=$2 run=$3"

regexp -- $rgxp $str result result1 result2 ... result1000

# тут result должен быть таким "nui=12 an_dg=a41 run=roze"
Тем самым покрыв любое разумное количество подшаблонов в $rgxp, но сие совсем уж уродливо.

Хотеть какой-нибудь параметр типа -aslist чтобы что-то вроде regexp -aslist — $rgxp $str result resultL сгружало все подшаблоны в resultL как в список, но нет же (((

★★★★★

Последнее исправление: CYB3R (всего исправлений: 2)

Да ладно, не так уж и много городить :)

proc do_it {rx str tmpl} {        
    set lst1 [regexp -inline -all $rx $str]
    set lst2 [lrange $lst1 1 end]
    set len [llength $lst2]
    for {set i 0} {$i<$len} {incr i} {
        set $i [lindex $lst2 $i]
    }
    return [subst $tmpl]
}

set str "l:12:a41:low-roze"
set rx {^l:([0-9]+):([0-9a-z]+):low-([a-z]+)}
set tmpl {nui=$0 an_dg=$1 run=$2}

puts [do_it $rx $str $tmpl]
nui=12 an_dg=a41 run=roze

qaqa ★★
()
Ответ на: комментарий от qaqa

Поправка: ключ -all тут не нужен, на автомате написал.

qaqa ★★
()
Ответ на: комментарий от qaqa

Доберусь до компа - попробую. Действительно не много выходит - я не знал про ключ inline - читать доки надо от актуальных версий короче... Спасибо.

Suntechnic ★★★★★
() автор топика
Последнее исправление: Suntechnic (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.