Что такое регулярное выражение для «Любое положительное целое число, кроме 0»

93

Как можно ^\d+$улучшить запретить 0?

ИЗМЕНИТЬ (сделать более конкретным):

Примеры , чтобы:
1
30
111
Примеров Disallow:
0
00
-22

Не имеет значения, разрешены ли положительные числа с нулем в начале (например 022).

Это для реализации Java JDK Regex.

Zeemee
источник
2
Вы хотите принять, например 076,?
Карл Кнехтель - вдали от дома
@Karl Knechtel: Но я могу пожертвовать этой функцией ради простоты.
Zeemee
3
«Любое положительное целое число, кроме 0», обратите внимание, что 0 не является положительным целым числом.
SK9

Ответы:

180

Попробуй это:

^[1-9]\d*$

... и некоторые отступы, превышающие 30-символьный лимит ответа SO :-).

Вот демо

Томаш Нуркевич
источник
Просто из любопытства, зачем нам \ d + в конце? Почему бы не ^[1-9]+$работать?
mtahmed
18
@mtahmed: ^[1-9]+$не позволил бы 10
Ли Райан
1
Это позволит 1. "\ d *" также соответствует пустой строке.
Daniel
@mtahmed ^[1-9]+$не позволит 10. @Mulmoth предложение позволит 1, так как \d*совпадает ноль или более раз. Однако это не позволит 076, так как это не начинается с [1-9].
Карл Кнехтель - вдали от дома
2
А как насчет 01?
Museful
72

Извините за опоздание, но OP хочет разрешить, 076но, вероятно, НЕ хочет 0000000000.

Итак, в этом случае нам нужна строка из одной или нескольких цифр, содержащая хотя бы один ненулевой . То есть

^[0-9]*[1-9][0-9]*$
Рэй Тоул
источник
Кажется, это соответствует тому, чего хотели ОП
Абдул
я хочу положительное целое и положительное десятичное число. у тебя есть какое-нибудь решение?
Вы должны задать это как новый вопрос, а не как комментарий. Но спойлер: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$это предположение о том, что вы подразумеваете под «десятичным числом». Вам нужны показательные детали? Это довольно сложно, так что задайте другой вопрос.
Ray Toal
1
+1 за рассмотрение углового случая! Кстати, этот шаблон будет работать точно так же: ^0*[1-9]\d*$поскольку первый [0-9]*активен только до тех пор, пока не [1-9]найдет первый ненулевой, то есть он активен только до тех пор, пока не будут начальные нули ( 0*).
mg007,
1
Это правильный ответ. Он принимает 00098, что является правильным поведением согласно вопросу.
Варун Шарма
20

Вы можете попробовать утверждение отрицательного просмотра вперед:

^(?!0+$)\d+$
Карл Кнехтель - вдали от дома
источник
30
Боже мой, мне страшно.
Дэниел
1
Это позволяет 01, 02 и т.д…
Matijs
12

Попробуйте этот, он лучше всего подходит для удовлетворения требований.

[1-9][0-9]*

Вот пример вывода

String 0 matches regex: false
String 1 matches regex: true
String 2 matches regex: true
String 3 matches regex: true
String 4 matches regex: true
String 5 matches regex: true
String 6 matches regex: true
String 7 matches regex: true
String 8 matches regex: true
String 9 matches regex: true
String 10 matches regex: true
String 11 matches regex: true
String 12 matches regex: true
String 13 matches regex: true
String 14 matches regex: true
String 15 matches regex: true
String 16 matches regex: true
String 999 matches regex: true
String 2654 matches regex: true
String 25633 matches regex: true
String 254444 matches regex: true
String 0.1 matches regex: false
String 0.2 matches regex: false
String 0.3 matches regex: false
String -1 matches regex: false
String -2 matches regex: false
String -5 matches regex: false
String -6 matches regex: false
String -6.8 matches regex: false
String -9 matches regex: false
String -54 matches regex: false
String -29 matches regex: false
String 1000 matches regex: true
String 100000 matches regex: true
Палаш Канти Кунду
источник
2
Спасибо, но это не добавляет ценности или элегантности по сравнению с принятым ответом [1-9]\d*.
Zeemee
1
@Zeemee неверно, так как \ d может содержать цифры, отличные от 0-9. Например, арабские цифры, такие как واحد в некоторых библиотеках.
dummyDev
@dummyDev Я не знал об этом. Спасибо за упоминание!
Zeemee,
К сожалению, это вернется к "123abcd".
Чарит Джаясанка,
Чарит Джаясанка - да, ему все еще нужен ^ в начале и «$» в конце :-)
Стив Бароти
7

^\d*[1-9]\d*$

это может включать все положительные значения, даже если оно дополнено Zero спереди

Позволяет

1

01

10

11 и т. Д.

не позволяют

0

00

000 и т. Д.

Manoj
источник
3

Любое положительное целое число, кроме 0: ^\+?[1-9]\d*$
Любое положительное целое число, включая 0:^(0|\+?[1-9]\d*)$

user11856357
источник
2

Получил это:

^[1-9]|[0-9]{2,}$

Кто-то его бьет? :)

Zeemee
источник
3
Это позволит. 00Вы хотите этого? А это позволит 1aaaaaи abcd01. ^принадлежит только первому варианту и $только второму, чтобы решить эту проблему, заключите его в скобки^([1-9]|[0-9]{2,})$
stema
Хорошо, это принимает 000000000. Вы сказали любое целое число, кроме нуля .
Рэй Тоал,
2

Ради удовольствия, еще одна альтернатива с использованием опережающих просмотров:

^(?=\d*[1-9])\d+$

Столько цифр, сколько хотите, но должна быть хотя бы одна [1-9].

каши
источник
2

Возможно, вы захотите это (изменить: разрешить номер формы 0123):

^\\+?[1-9]$|^\\+?\d+$

однако, если бы это был я, я бы вместо этого сделал

int x = Integer.parseInt(s)
if (x > 0) {...}
Ли Райан
источник
1
Две проблемы: это также соответствует «123abc» и возвращает 123, и это может вызвать исключение ParseException.
Daniel
@Daniel: я предполагаю, что это может быть использовано в более крупной схеме синтаксического анализа, поэтому у вас будет регулярное выражение / BNF, которое захватывает только цифры, и код Java, чтобы проверить, что захваченные цифры ненулевые положительные.
Ли Райан,
@Daniel: в любом случае вам все равно понадобятся данные в виде целого числа, и поэтому рано или поздно вам все равно придется вызывать parseInt () или запускать собственный parseInt ().
Ли Райан,
@Daniel: Integer.parseInt()сам по себе добавляет очень мало накладных расходов. Это дорогое удовольствие - выбросить и отловить исключения.
Алан Мур,
@Lie: что с \\+?приставками? Я предполагаю, что это должен быть экранированный знак плюса, как в исходном коде Java, но почему? Если знаки минуса не разрешены, я думаю, можно с уверенностью предположить, что знаки плюс тоже отсутствуют.
Алан Мур,
0

Этот RegEx соответствует любому положительному целому числу из 0:

(?<!-)(?<!\d)[1-9][0-9]*

Он работает с двумя отрицательными функциями просмотра назад, которые ищут минус перед числом, что указывает на отрицательное число. Это также работает для любого отрицательного числа больше -9 (например, -22).

Александр Хамманс
источник
0

Мой шаблон сложный, но он точно охватывает «Любое положительное целое число, кроме 0» (1 - 2147483647, не долго). Это для десятичных чисел и не допускает начальных нулей.

^((1?[1-9][0-9]{0,8})|20[0-9]{8}|(21[0-3][0-9]{7})|(214[0-6][0-9]{6})
|(2147[0-3][0-9]{5})|(21474[0-7][0-9]{4})|(214748[0-2][0-9]{3})
|(2147483[0-5][0-9]{2})|(21474836[0-3][0-9])|(214748364[0-7]))$
АлексейМЛД
источник
-2

^ [1-9] * $ - это самое простое, что я могу придумать


источник
Это регулярное выражение по ошибке не сможет сопоставить такие числа, как 10и 29303. Он также будет соответствовать пустой строке.
OmnipotentEntity
-3

Это должно разрешать только десятичные дроби> 0

^([0-9]\.\d+)|([1-9]\d*\.?\d*)$
user259469
источник