reg ifodasini qidirish va xatoni almashtirish

Unixdagi tegishli foydalanuvchi guruhlari ro'yxati bo'lgan satrni qidirishga harakat qilaman,

va vsifax guruhini o'zgartiring yoki uning oldingi yoki oxirgi qismini , oldidan null qiymat yoki bo'sh joy bilan qaysi biri osonroq

$gs =~ s/*,vsifax//;

ammo skriptni ishlatishga harakat qilsam, bu xatoni qaytaradi

$ usermove.pl > users.sh
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE ,vsifax/
at usermove.pl line 13.

Muammoning nima ekanligini tushunolmayapman va muntazam ifodalarda bir necha darsliklarni o'qib chiqdim va uni o'ldirdim

0
Muntazam iboralarda nandir (* bu holda) atom bilan bog'langanligini kuzatib boradi. Shunday qilib registrda birinchi element sifatida nolga ega bo'lish har doim xato bo'ladi. Xato xabari aniqroq bo'lishi mumkin deb o'ylayotganingizni eshitish qiziqarli bo'ladi.
qo'shib qo'ydi muallif Dave Cross, manba
@davorg, kimdir POSIX RE-dan foydalanib, u "raqamlash" nima bilan tanish bo'lishi mumkin emas. Men aniqroq xabarni "Nomenerdan oldin naqsh yo'q" deb o'ylayman *. "
qo'shib qo'ydi muallif Axeman, manba
@davorg - "Atom" ning "raqamlashtiruvchidan" keyin kelishi kerak deb o'ylashimdan kelib chiqqanim sababli, "Kvalifikator" dan oldin hech narsa bo'lmaganligi sababli men uchun noma'lum edi.
qo'shib qo'ydi muallif ScottC, manba
Ha, bu ham yordamchi bo'lar edi, chunki bu me'yorni bilganim uchun, ularni "metakarakteriyalar" deb atashgan va bundan oldin regexdagi atamani taqqoslashni hech qachon ko'rmaganman.
qo'shib qo'ydi muallif ScottC, manba

2 javoblar

O'ylaymanki, bu buyruq shu kabi ishlashi kerak.

$gs =~ s/*,vsifax//;

bo'lishi kerak:

$gs =~ s/,?vsifax//;

O'ylaymanki, guruh nomini va oxirgi vergingizni o'chirib tashlamoqchimisiz?

4
qo'shib qo'ydi
yoki bu ham ishlaydi
qo'shib qo'ydi muallif ScottC, manba

Buni sinab ko'ring, men sizning regeksingizda * kerak emas deb o'ylayman

$gs =~ s/(,?vsifax)|(vsifax,?)//;
2
qo'shib qo'ydi
@ScottC Odatda, * oldingi belgining 0 yoki undan ko'p narsalarga mos keladi.
qo'shib qo'ydi muallif Vatine, manba
@ScottC Sizning xatolaringiz ko'tariladi, chunki nolga teng * noto'g'ri joyda. Sizning regeksingizni men bilan almashtirishga harakat qiling va menga nima bo'lganingizni ayting.
qo'shib qo'ydi muallif Fred, manba
@ScottC Sizning * kodi verguldan keyin joylashtirilgan bo'lishi kerak va shuning uchun skriptni ishlatishda xatolik yuzaga keladi. Siz o'zingizning vergingizning misolini 0 .. bo'lishi mumkin bo'lgan holatda * foydalanasiz (sizning namunangizda). Foydalanish? undan samarali foydalanishingiz mumkin, chunki sizning holatingizda vsifaxdan oldin 1 yoki 0 vergul bo'lishi mumkin
qo'shib qo'ydi muallif Fred, manba
vsifax oldida , bo'lmasligi va kelgusi belgining nol yoki ko'proq natijalariga mos keladigan vaqt bo'lishi mumkin, deb o'ylayman .... harakat qilaman
qo'shib qo'ydi muallif ScottC, manba
OK, shuning uchun mening keyingi savolim nima uchun o'qigan har bir narsani * nol yoki , yoki nol yoki undan ko'p narsalarga to'g'ri kelishi kerak,
qo'shib qo'ydi muallif ScottC, manba
ahhhhhhhhhhhhhh bu to'g'ri, mening yomon,
qo'shib qo'ydi muallif ScottC, manba
shuning uchun mening skriptim men xohlagan narsani qilishim kerak *
qo'shib qo'ydi muallif ScottC, manba