LINUX.ORG.RU

uc и ucfirst в регулярном выражении

 ,


0

1

Привет, Лор. Помоги с регуляркой. Хочу в строке «hello world, lor», буквы lo преобразовать через uc, а ld через ucfirst.

Только почему-то в случае

print "hello world, lor" =~ s/(lo)|(ld)/\U$1\u$2/rg;
ld преобразовывается в LD, а не Ld, как необходимо. А в этом случае
print "hello world, lor" =~ s/(lo)|(ld)/\u$2\U$1/rg;
всё нормально: lo в LO, ld в Ld.

Почему так? Есть какая-то тонкость в работе этих escape символов, или зачем такой порядок?

Deleted

Ответ на: комментарий от Olegymous

Сорри за тупой вопрос: а каково действие \U в данном контексте? Почему оно так себя ведёт, что надо ограничивать через \E? Почему во втором варианте работало без ограничивания?

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

Возможно, у тебя в переменную $1 попадает реальное совпадение, то есть либо lo либо ld, так как функция применятся не за один проход. попробуй поменять $1 $2 на $2 $3. Я перл не знаю, но поигрался с js и вот что получилось


String.prototype.U=function(){return this.toUpperCase()}
String.prototype.u=function(){return this.replace(/^(.)/, function(first){return first.toUpperCase()})}

s="Hello world, lor"
re=/(lo)|(ld)/g
s.replace(re, function(all,lo,ld){
   console.log(all, lo, ld)
})

//  lo lo undefined
//  ld undefined ld
//  lo lo undefined

console.log(s.replace(re, function(all, lo, ld){
   if(lo) return lo.U(); if(ld) return ld.u()
}))

//  HelLO worLd, LOr

terminator-101 ()
Ответ на: комментарий от Deleted

Ну тут все просто объясняется: \u меняет только первый символ аргумента, а \U весь аргумент

Olegymous ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.