ошибка поиска и замены выражения reg

#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