Regex cho "Bất kỳ số nguyên dương nào, không bao gồm 0" là gì


91

Làm thế nào có thể ^\d+$được cải thiện để không cho phép 0?

CHỈNH SỬA (Làm cho nó cụ thể hơn):

Ví dụ cho phép:
1
30
111
Ví dụ không cho phép:
0
00
-22

Không quan trọng nếu các số dương với số 0 đứng đầu có được phép hay không (ví dụ 022).

Điều này dành cho việc triển khai Java JDK Regex.


2
Bạn có muốn chấp nhận, chẳng hạn 076,?
Karl Knechtel - xa nhà

@Karl Knechtel: Nhưng tôi có thể hy sinh tính năng này vì đơn giản.
Zeemee

3
“Mọi số nguyên dương, không bao gồm 0” lưu ý rằng 0 không phải là số nguyên dương.
SK9

Câu trả lời:


176

Thử cái này:

^[1-9]\d*$

... và một số khoảng đệm vượt quá giới hạn câu trả lời SO 30 ký tự :-).

Đây là Demo


Chỉ vì tò mò, tại sao chúng ta cần \ d + ở cuối? Tại sao không ^[1-9]+$hoạt động?
mtahmed

18
@mtahmed: ^[1-9]+$sẽ không cho phép 10
Lie Ryan

1
Nó sẽ cho phép 1. "\ d *" cũng khớp với chuỗi trống.
Daniel

@mtahmed ^[1-9]+$sẽ không cho phép 10. @Mulmoth đề xuất sẽ cho phép 1, vì \d*đối sánh không hoặc nhiều lần. Tuy nhiên, nó sẽ không cho phép 076, vì điều đó không bắt đầu bằng a [1-9].
Karl Knechtel - xa nhà

2
Nhưng những gì về 01?
Museful

71

Xin lỗi vì đến muộn nhưng OP muốn cho phép 076nhưng có lẽ KHÔNG muốn cho phép 0000000000.

Vì vậy, trong trường hợp này, chúng ta muốn một chuỗi gồm một hoặc nhiều chữ số chứa ít nhất một chữ số khác không . Đó là

^[0-9]*[1-9][0-9]*$

Điều này dường như đáp ứng những gì OP muốn
Abdul

tôi muốn số nguyên dương và số thập phân dương. bạn có bất kỳ giải pháp?

Bạn nên hỏi điều đó như một câu hỏi mới hơn là một nhận xét. Nhưng spoiler: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$nhưng điều đó đang tạo ra một giả định về những gì bạn có nghĩa là "thập phân." Bạn có cần phần số mũ không? Điều này khá liên quan, vì vậy hãy hỏi một câu hỏi khác.
Ray Toal

1
+1 để xem xét trường hợp góc! BTW mẫu này sẽ hoạt động giống hệt nhau: ^0*[1-9]\d*$vì mẫu đầu tiên [0-9]*chỉ hoạt động cho đến khi [1-9]tìm thấy đầu tiên khác 0, tức là nó chỉ hoạt động cho đến khi có các số 0 ban đầu ( 0*).
mg007,

1
Đây là câu trả lời đúng. Nó chấp nhận 00098 là hành vi đúng theo câu hỏi.
Varun Sharma


12

Hãy thử cái này, cái này hoạt động tốt nhất để đáp ứng đủ yêu cầu.

[1-9][0-9]*

Đây là đầu ra mẫu

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
Cảm ơn bạn, nhưng nó không thêm bất kỳ giá trị hoặc sự sang trọng nào khi so sánh với câu trả lời được chấp nhận [1-9]\d*.
Zeemee

1
@Zeemee không đúng vì \ d có thể bao gồm các chữ số không phải 0-9. Ví dụ các chữ số Ả Rập như واحد trong một số thư viện.
dummyDev

@dummyDev Tôi không biết điều đó. Cảm ơn bạn đã đề cập!
Zeemee

Đáng buồn thay, điều này sẽ trả về true cho "123abcd".
Charith Jayasanka

Charith Jayasanka - vâng, nó vẫn cần dấu ^ ở đầu và dấu "$" ở cuối :-)
Steve Baroti

7

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

điều này có thể bao gồm tất cả các giá trị dương, ngay cả khi nó được đệm bởi số 0 ở phía trước

Cho phép

1

01

10

11 vv

không cho phép

0

00

000 vv ..


3

Bất kỳ số nguyên dương nào, không bao gồm 0: ^\+?[1-9]\d*$
Mọi số nguyên dương, bao gồm 0:^(0|\+?[1-9]\d*)$


2

Có cái này:

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

Ai đó đánh nó? :)


3
Điều này sẽ cho phép 00Bạn có muốn điều này? Và nó sẽ cho phép 1aaaaaabcd01. ^chỉ thuộc về phương án đầu tiên và $duy nhất vào thứ hai, để giải quyết đặt này ngoặc xung quanh nó^([1-9]|[0-9]{2,})$
Stema

Vâng, điều này chấp nhận 000000000. Bạn đã nói bất kỳ số nguyên nào không bao gồm số 0 .
Ray Toal,

2

Chỉ để giải trí, một giải pháp thay thế khác sử dụng trang đầu:

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

Có bao nhiêu chữ số bạn muốn, nhưng phải có ít nhất một chữ số [1-9].


2

Bạn có thể muốn điều này (chỉnh sửa: số cho phép của biểu mẫu 0123):

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

tuy nhiên, nếu là tôi, thay vào đó tôi sẽ làm

int x = Integer.parseInt(s)
if (x > 0) {...}

1
Hai vấn đề: Điều này cũng khớp với "123abc" và trả về 123 và điều này có thể tạo ra một ParseException.
Daniel

@Daniel: Tôi đoán điều này có thể được sử dụng bên trong một lược đồ phân tích cú pháp lớn hơn, do đó bạn sẽ có một regex / BNF chỉ ghi lại các chữ số và một mã java để kiểm tra xem các chữ số được chụp có phải là số dương khác không.
Lie Ryan

@Daniel: trong mọi trường hợp, bạn vẫn cần dữ liệu dưới dạng số nguyên và vì vậy sớm hay muộn bạn vẫn cần gọi parseInt () hoặc cuộn parseInt () của riêng bạn.
Lie Ryan

@Daniel: Integer.parseInt()bản thân nó thêm rất ít chi phí. Đó là việc ném và bắt các trường hợp ngoại lệ rất tốn kém.
Alan Moore

@Lie: thỏa thuận với các \\+?tiền tố là gì? Tôi đoán đó phải là một dấu cộng thoát vì nó sẽ xuất hiện trong mã nguồn Java, nhưng tại sao? Nếu không cho phép các dấu trừ, tôi nghĩ cũng có thể an toàn khi cho rằng các dấu cộng cũng bị loại bỏ.
Alan Moore

0

RegEx này khớp với bất kỳ Số nguyên dương nào trong số 0:

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

Nó hoạt động với hai giao diện phủ định, tìm kiếm một số trừ trước một số, cho biết đó là một số âm. Nó cũng hoạt động với bất kỳ số âm nào lớn hơn -9 (ví dụ -22).


0

Mẫu của tôi phức tạp, nhưng nó bao gồm chính xác "Mọi số nguyên dương, không bao gồm 0" (1 - 2147483647, không dài). Nó dành cho các số thập phân và không cho phép các số 0 ở đầu.

^((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] * $ là đơn giản nhất tôi có thể nghĩ đến


Biểu thức chính quy này sẽ không khớp với các số như 1029303. Nó cũng sẽ khớp với chuỗi trống.
OmnipotentEntity

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.