#regex #perl #replace
#регулярное выражение #perl #заменить
Вопрос:
Я пытаюсь выполнить поиск в строке, представляющей собой список групп, к которым принадлежит пользователь в unix,
и замените группу vsifax
или ее середину или конец строковой группы ,
перед ней нулевым значением или пробелом, в зависимости от того, что проще
$gs =~ s/*,vsifax//;
но это возвращает ошибку при попытке запустить скрипт
$ usermove.pl > users.sh
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE ,vsifax/
at usermove.pl line 13.
Я не вижу, в чем проблема, я прочитал и перечитал несколько руководств по регулярным выражениям, и это меня убивает
Комментарии:
1. В регулярных выражениях квантификатор (в данном случае *) следует за атомом, с которым он связан. Таким образом, наличие квантора в качестве первого элемента в регулярном выражении всегда будет ошибкой. Было бы интересно услышать, как, по вашему мнению, сообщение об ошибке может быть более четким.
2. @davorg, для кого-то, кто использует POSIX REs, он может быть не настолько знаком с тем, что такое «квантификатор». Я думаю, что более ясным сообщением может быть «Нет шаблона перед квантификатором ‘*'»
3. @davorg — Поскольку мое замешательство возникло из-за мысли, что «атом» должен быть ПОСЛЕ «квантора», мне было непонятно, почему важно, чтобы перед «Квантором» ничего не было
4. @Axeman да, это тоже помогло бы, зная, что такое квантификатор, я предположил, что они называются «метасимволами» и никогда раньше не видели термин квантификатор в регулярных выражениях
Ответ №1:
Я предполагаю, что эта команда должна выглядеть так, чтобы работать.
$gs =~ s/*,vsifax//;
должно быть:
$gs =~ s/,?vsifax//;
Я полагаю, вы хотите удалить имя группы и последнюю запятую, верно?
Ответ №2:
Попробуйте это, я не думаю, что * требуется в вашем регулярном выражении
$gs =~ s/(,?vsifax)|(vsifax,?)//;
Комментарии:
1. Я думаю, это будет потому, что могут быть случаи, когда впереди нет
,
vsifax
, а * соответствует нулю или более вхождений следующего символа …. но я постараюсь2. @ScottC Ваша ошибка повышается, потому что ваш квантификатор * находится не в том месте. Попробуйте заменить ваше регулярное выражение на мое и скажите мне, что вы получите.
3. итак, мой следующий вопрос: ПОЧЕМУ это сработало без *, когда все, что я прочитал, говорит, что мне нужно, чтобы * соответствовало нулю или более случаев
,
4. @ScottC Обычно * соответствует 0 или более вхождениям ПРЕДЫДУЩЕГО символа.
5. @ScottC Ваш * должен был быть помещен после запятой, а не раньше, поэтому вы получаете сообщение об ошибке при попытке запустить скрипт. Вы используете *, когда возможно иметь 0 .. * экземпляр вашей запятой (в вашем примере). Использование ? более эффективен, потому что в вашем случае перед vsifax может быть запятая 1 или 0