Що таке регулярний вираз для "Будь-яке додатне ціле число, за винятком 0"


93

Як можна ^\d+$покращити заборону 0?

EDIT (Зробіть це більш конкретним):

Приклади, які можна дозволити:
1
30
111
Приклади, які заборонити:
0
00
-22

Неважливо, дозволені позитивні числа з початковим нулем чи ні (наприклад 022).

Це для реалізації Java JDK Regex.


2
Ви хочете прийняти, наприклад 076,?
Карл Кнехтель - далеко від дому

@ Карл Кнехтель: Але я можу пожертвувати цією функцією заради простоти.
Zeemee

3
“Будь-яке додатне ціле число, крім 0”, зауважте, що 0 не є додатним цілим числом.
SK9

Відповіді:


180

Спробуйте це:

^[1-9]\d*$

... і деяке заповнення, щоб перевищити 30 символів ТО відповідь :-).

Ось Демо


Просто з цікавості, навіщо нам в кінці \ d +? Чому б не ^[1-9]+$працювати?
mtahmed

18
@mtahmed: ^[1-9]+$не дозволить 10
Lie Ryan

1
Це дозволить 1. "\ d *" також відповідає порожньому рядку.
Даніель

@mtahmed ^[1-9]+$не дозволив 10. @Mulmoth пропозиція дозволить 1, оскільки \d*відповідає нулю або більше разів. Однак це не дозволить 076, оскільки це не починається з a [1-9].
Карл Кнехтель - далеко від дому

2
Але про що 01?
Музичний

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, що є правильною поведінкою відповідно до запитання.
Варун Шарма


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".
Charith Jayasanka,

Чаріт Джаясанка - так, йому все ще потрібні ^ на початку і "$" в кінці :-)
Стів Бароті

7

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

сюди можуть входити всі позитивні значення, навіть якщо це спереду заповнено нулем

Дозволяє

1

01

10

11 тощо

не дозволяють

0

00

000 тощо.


3

Будь-яке додатне ціле число, за винятком 0: ^\+?[1-9]\d*$
Будь-яке додатне ціле число, включаючи 0:^(0|\+?[1-9]\d*)$


2

Отримав це:

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

Хтось його б’є? :)


3
Це дозволило б 00Ви хочете цього? І це дозволить 1aaaaaі abcd01. ^належить лише першій альтернативі і $лише другій, щоб вирішити це, поставте дужки навколо неї^([1-9]|[0-9]{2,})$
stema

Ну, це приймає 000000000. Ви сказали будь-яке ціле число, крім нуля .
Ray Toal

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: Я думаю, це може бути використано всередині більшої схеми синтаксичного аналізу, тому у вас буде регулярний вираз / BNF, який фіксує лише цифри, і код Java для перевірки того, що захоплені цифри не відмінні від позитивного.
Lie Ryan

@Daniel: у будь-якому випадку вам все одно знадобляться дані як ціле число, і тому рано чи пізно вам все одно доведеться викликати parseInt () або прокрутити власний parseInt ().
Lie Ryan

@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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.