Что такое регулярное выражение для положительного целого? Мне нужно это в предложении if
в сценарии bash
, и я попробовал [[ $myvar == [1-9][0-9]* ]]
, и я не понимаю, почему он говорит, например, что 6 не является целым числом и 20O0O0
есть.Регулярное выражение для положительного целого
ответ
==
оператор выполняет сопоставление с образцом, а не регулярные выражения. [1-9][0-9]*
соответствует строке, начинающейся с 1-9, следующей цифрой в диапазоне 0-9, а затем ничего, включая пустую строку. *
не оператор, а шаблон. Таким образом, базовое совпадение шаблонов недостаточно.
Вы можете использовать расширенный сопоставления с образцом, который может быть включен в явном виде, или (в случае новых версий bash
) предполагается, должен быть включен для аргумента ==
и !=
.
shopt -s extglob # may not be necessary
if [[ $myvar == [1-9]*([0-9]) ]]; then
Шаблон *([0-9])
будет соответствовать ноль или более вхождений шаблона, заключенного в скобки.
Если вы хотите использовать регулярное выражение, вместо этого, используйте оператор =~
. Обратите внимание, что теперь вам нужно привязать ваше регулярное выражение к началу и концу строки, которую вы соответствуете; шаблоны делают это автоматически.
if [[ $myvar =~ ^[0-9][1-9]*$ ]]; then
Обратите внимание, что некоторые из путаницы проистекает из того факта, что [...]
является как юридическое регулярное выражение и шаблон, и символы, такие как *
используются в обоих, но с немного отличающимися значениями. Также обратите внимание, что расширенные шаблоны эквивалентны силе регулярным выражениям (все, что вы можете сопоставить с тем, которое вы можете сопоставить с другим), но я оставляю это доказательство в качестве упражнения для читателя.
'if [[$ myvar == [1-9] + ([0-9])]]; то ', похоже, не работает для' [1,9] 'но' if [[$ myvar == [1-9] * ([0-9])]]; тогда я думаю, что делает. спасибо – adikinzor
А, простите об этом. Если вы разрешили номер начинать с 0, вы могли бы просто использовать '+ ([0-9])', и я думаю, что это имело это в виду, когда я написал ответ. В вашем случае вы хотите использовать '*' вместо этого. – chepner
[[ $myvar =~ ^[+]*[[:digit:]]*$ ]] && echo "Positive Integer"
не должен делать это?
Если 0
не положительное число в описании и вы не готовы принять ведущие нули или плюс, а затем сделать
[[ $myvar =~ ^[1-9]+[[:digit:]]*$ ]] && echo "Positive Integer"
Там нет необходимости использовать регулярные выражения, чтобы проверить положительное целое число. Просто ((...))
конструкция так:
isInt() {
# do sanity check for argument if needed
local n="$1"
[[ $n == [1-9]* && $n -gt 0 ]] 2>/dev/null && echo '+ve integer' || echo 'nope'
}
Затем использовать его как:
isInt '-123'
nope
isInt 'abc'
nope
isInt '.123'
nope
isInt '0'
nope
isInt '789'
+ve integer
isInt '0123'
nope
foo=1234
isInt 'foo'
nope
"Положительное целое число" не является достаточно конкретным. Начальный ноль может быть законным, особенно если литерал указан в базе 8. Является ведущим '+' юридическим? Наконец, '==' не выполняет регулярное выражение; он выполняет * pattern * matching. – chepner
^[1-9] [0-9] * $ не работает:/ – adikinzor
ведущий 0 не является законным – adikinzor