Является ли шаблон `^ -0 + ([0-9] +)` тем же самым, что `^ -0 + ([1-9] +)`?

Aunque ErikF tiene razón en que, en general, esto debería estar bien, quiero señalar un posible problema:

Puede asignar diferentes nombres de usuario al mismo UID. Si hace uso de esto, las herramientas que asignan un UID a un nombre de usuario generalmente elegirán el primer nombre de usuario que encuentren para ese UID en /etc/passwd. La clasificación puede hacer que aparezca primero un nombre de usuario diferente. Para fines de visualización (, p. ls -lsalida ), cualquier nombre de usuario debería funcionar, pero es posible que haya configurado algún programa para aceptar solicitudes del nombre de usuario A, donde rechazará esas solicitudes si las ve provenientes del nombre de usuario B, incluso si A y B son el mismo usuario.

-3
05.11.2018, 22:56
2 ответа

Нет, ^-0+([1-9]+)не соответствует числам типа -320.

Редактировать :Перечитывая шаблон, на самом деле есть две причины, по которым -320не совпадает,

  1. После-(нет 0, а +говорит, что должен быть )-, но это не разница между двумя шаблонами (и, вероятно, их недостаток)

  2. Там есть 0после первой не -нулевой цифры -, это разница между шаблонами.

4
28.01.2020, 05:18

Будут ли ^-0+([0-9]+)и ^-0+([1-9]+)без $совпадать в одних и тех же строках, зависит от локали. В локали C/POSIX они будут совпадать в одних и тех же строках (, включая -01fooи -00230bar), но то, что будет захвачено (...), может быть другим (, например, первое будет захватывать 230. ] на -00230bar, а последний23).

С $, как указал @Henrik, они не будут совпадать в одних и тех же строках. ^-0+([1-9]+)$не будет соответствовать -00230.

В других регионах пробег может отличаться. Например, в локали en_GB.UTF-8в системе Solaris 10 ^-0+([0-9]+)будет соответствовать -0⓿⓿12, поскольку — это символ, который сортируется в -между 0и 1, поэтому соответствует [0-1]или [0-9], но не ^-0+([1-9]+), поскольку ни 0+, ни [1-9]не совпадают на ⓿.

Для полноты, чтобы сделать это со стандартным синтаксисом shбез необходимости полагаться на расширения bash/ ksh93,ты можешь сделать:

case ${b#-0} in
  ("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
  (*) b=${b#"${b%%[!0-]*}"};;
esac

Здесь с тем преимуществом, что[[:digit:]](в отличие от[0-9])соответствует только 0123456789.

3
28.01.2020, 05:18

Теги

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