2016-12-17 3 views
-1

Что такое регулярное выражение для положительного целого? Мне нужно это в предложении if в сценарии bash, и я попробовал [[ $myvar == [1-9][0-9]* ]], и я не понимаю, почему он говорит, например, что 6 не является целым числом и 20O0O0 есть.Регулярное выражение для положительного целого

+0

"Положительное целое число" не является достаточно конкретным. Начальный ноль может быть законным, особенно если литерал указан в базе 8. Является ведущим '+' юридическим? Наконец, '==' не выполняет регулярное выражение; он выполняет * pattern * matching. – chepner

+0

^[1-9] [0-9] * $ не работает:/ – adikinzor

+0

ведущий 0 не является законным – adikinzor

ответ

2

== оператор выполняет сопоставление с образцом, а не регулярные выражения. [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 

Обратите внимание, что некоторые из путаницы проистекает из того факта, что [...] является как юридическое регулярное выражение и шаблон, и символы, такие как * используются в обоих, но с немного отличающимися значениями. Также обратите внимание, что расширенные шаблоны эквивалентны силе регулярным выражениям (все, что вы можете сопоставить с тем, которое вы можете сопоставить с другим), но я оставляю это доказательство в качестве упражнения для читателя.

+0

'if [[$ myvar == [1-9] + ([0-9])]]; то ', похоже, не работает для' [1,9] 'но' if [[$ myvar == [1-9] * ([0-9])]]; тогда я думаю, что делает. спасибо – adikinzor

+0

А, простите об этом. Если вы разрешили номер начинать с 0, вы могли бы просто использовать '+ ([0-9])', и я думаю, что это имело это в виду, когда я написал ответ. В вашем случае вы хотите использовать '*' вместо этого. – chepner

1
[[ $myvar =~ ^[+]*[[:digit:]]*$ ]] && echo "Positive Integer" 

не должен делать это?

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

[[ $myvar =~ ^[1-9]+[[:digit:]]*$ ]] && echo "Positive Integer" 
+0

№. Сначала он печатает целое число Pos, когда переменная равно 0, а также принимает переменные, которые начинаются с 0 ... – adikinzor

+0

@ adikinzor: Является ли ведущий '+' законным? – sjsam

+0

@adikinzor: Я сделал редактирование. – sjsam

1

Там нет необходимости использовать регулярные выражения, чтобы проверить положительное целое число. Просто ((...)) конструкция так:

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 
+0

Предполагает, что для начала вводится целое число определенного типа. – chepner

+0

Я боюсь, что это даст ложное положительное значение, например, 12.45 – sjsam

+0

@sjsam Нет, не будет. 'isInt '12 .45'' напечатает' nope' – anubhava