Как написать регулярное выражение, которое позволяет неповторяющиеся подчеркивания

С риском добавления другого примера для игнорирования, вот моя схема.

  • handle -n arg и --name=arg
  • разрешает аргументы в конце
  • показывает правильные ошибки, если что-то с ошибкой
  • совместимо, не использует bashisms
  • , читается, не требует сохранения состояния в цикле

Надеюсь, что это кому-то полезно.

while [ "$#" -gt 0 ]; do
  case "$1" in
    -n) name="$2"; shift 2;;
    -p) pidfile="$2"; shift 2;;
    -l) logfile="$2"; shift 2;;

    --name=*) name="${1#*=}"; shift 1;;
    --pidfile=*) pidfile="${1#*=}"; shift 1;;
    --logfile=*) logfile="${1#*=}"; shift 1;;
    --name|--pidfile|--logfile) echo "$1 requires an argument" >&2; exit 1;;

    -*) echo "unknown option: $1" >&2; exit 1;;
    *) handle_argument "$1"; shift 1;;
  esac
done
1
задан Eric Hutchins 26 March 2019 в 18:17
поделиться

2 ответа

Чтобы расширить регулярное выражение, чтобы при желании можно было использовать только одно подчеркивание за раз, которое слишком зажато в строке, вы можете использовать это регулярное выражение.

[A-Za-z][A-Za-z0-9]*(_[A-Za-z0-9]+)*

Я только что добавил (_[A-Za-z0-9]+)* часть, которая будет позволять одиночному подчеркиванию, за которым следует по крайней мере один буквенно-цифровой символ, целое его ноль или более раз, чтобы сделать подчеркивание необязательным.

Теперь вам придется позаботиться о других аспектах, так как я не знаком с флексом.

0
ответ дан Pushpesh Kumar Rajwanshi 26 March 2019 в 18:17
поделиться

В вашем [A-Za-z]([A-Za-z0-9][_]?[A-Za-z0-9])* первое [A-Za-z0-9] может / должно быть опущено (рассмотрим, например, однобуквенные идентификаторы), что приводит к [A-Za-z]([_]?[A-Za-z0-9])*. Кажется, это именно то, о чем спрашивали, и это хорошее упражнение для изучения эффектов объединения необязательных элементов при повторении в регулярном выражении.

0
ответ дан Björn Höhrmann 26 March 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: