นิพจน์ทั่วไปสำหรับ "จำนวนเต็มบวกใด ๆ ยกเว้น 0"


93

วิธีการสามารถ^\d+$ได้รับการปรับปรุงให้ไม่อนุญาต0?

แก้ไข (ทำให้เป็นรูปธรรมมากขึ้น):

ตัวอย่างที่จะอนุญาตให้:
1
30
111
ตัวอย่างเพื่อไม่อนุญาต:
0
00
-22

ไม่สำคัญว่าจะอนุญาตให้ใช้ตัวเลขบวกที่มีศูนย์นำหน้าได้หรือไม่ (เช่น022)

สำหรับการใช้งาน Java JDK Regex


2
คุณต้องการยอมรับตัวอย่างเช่น076?
Karl Knechtel - ออกจากบ้านเมื่อ

@Karl Knechtel: แต่ฉันสามารถสละคุณสมบัตินี้ได้เพื่อความเรียบง่าย
Zeemee

3
“ จำนวนเต็มบวกใด ๆ ยกเว้น 0” โปรดทราบว่า 0 ไม่ใช่จำนวนเต็มบวก
SK9

คำตอบ:


180

ลองสิ่งนี้:

^[1-9]\d*$

... และช่องว่างบางส่วนเกินขีด จำกัด คำตอบ SO 30 อักขระ :-)

นี่คือการสาธิต


ด้วยความอยากรู้อยากเห็นทำไมเราต้อง \ d + ในตอนท้าย? ทำไมไม่^[1-9]+$ทำงาน?
mtahmed

18
@mtahmed: ^[1-9]+$ไม่ยอมให้ 10
Lie Ryan

1
จะอนุญาตให้ 1. "\ d *" ตรงกับสตริงว่างด้วย
Daniel

@mtahmed จะไม่อนุญาตให้^[1-9]+$ 10@Mulmoth ข้อเสนอแนะจะอนุญาต1เนื่องจาก\d*ตรงกับศูนย์หรือมากกว่าครั้ง อย่างไรก็ตามจะไม่อนุญาต076เนื่องจากไม่ได้เริ่มต้นด้วยไฟล์[1-9].
Karl Knechtel - ออกจากบ้านเมื่อ

2
แต่เรื่อง01อะไร?
Museful

72

ขออภัยที่จะมาในช่วงปลายปี แต่ OP ต้องการที่จะอนุญาตให้แต่อาจไม่ต้องการที่จะช่วยให้0760000000000

ดังนั้นในกรณีนี้เราต้องการสตริงของหนึ่งหรือมากกว่าตัวเลขที่มีอย่างน้อยหนึ่งที่ไม่ใช่ศูนย์ นั่นคือ

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

ดูเหมือนว่าจะเติมเต็มสิ่งที่ OP ต้องการ
อับดุล

ฉันต้องการจำนวนเต็มบวกและทศนิยมที่เป็นบวก คุณมีวิธีแก้ไขหรือไม่?

คุณควรถามเป็นคำถามใหม่แทนที่จะเป็นความคิดเห็น แต่สปอยเลอร์: ^[0-9]*[1-9][0-9]*(\.[0-9]+)$แต่นั่นเป็นการตั้งสมมติฐานเกี่ยวกับความหมายของ "ทศนิยม" คุณต้องการชิ้นส่วนเลขชี้กำลังหรือไม่? เรื่องนี้ค่อนข้างเกี่ยวข้องดังนั้นโปรดถามคำถามอื่น
Ray Toal

1
+1 สำหรับการพิจารณากรณีมุม! BTW รูปแบบนี้จะทำงานเหมือนกันทุกประการ: ^0*[1-9]\d*$เนื่องจากรูปแบบแรก[0-9]*ใช้งานได้เท่านั้นจนกว่าจะ[1-9]พบครั้งแรกที่ไม่ใช่ศูนย์เช่นจะใช้งานได้จนกว่าจะมีศูนย์เริ่มต้น ( 0*)
mg007

1
นี่คือคำตอบที่ใช่ ยอมรับ 00098 ซึ่งเป็นพฤติกรรมที่ถูกต้องตามคำถาม
Varun Sharma


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

Charith Jayasanka - ใช่มันยังคงต้องการ ^ ที่จุดเริ่มต้นและ "$" ในตอนท้าย :-)
Steve Baroti

7

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

ซึ่งสามารถรวมค่าบวกทั้งหมดได้แม้ว่าจะมี Zero อยู่ด้านหน้าก็ตาม

อนุญาต

1

01

10

11 ฯลฯ

ไม่อนุญาตให้

0

00

000 เป็นต้น ..



2

มีสิ่งนี้:

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

ใครบางคนเต้นมัน? :)


3
สิ่งนี้จะอนุญาต00คุณต้องการสิ่งนี้ไหม และมันจะช่วยให้และ1aaaaa เป็นเพียงทางเลือกแรกและทางเลือกที่สองเท่านั้นที่จะแก้ปัญหานี้ใส่วงเล็บรอบตัวabcd01^$^([1-9]|[0-9]{2,})$
stema

000000000อย่างนี้ยอมรับ คุณไม่พูดจำนวนเต็มใด ๆไม่รวมศูนย์
Ray Toal

2

เพื่อความสนุกสนานอีกทางเลือกหนึ่งที่ใช้ Lookaheads:

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

ตัวเลขได้มากเท่าที่คุณต้องการ แต่ต้องมีอย่างน้อยหนึ่ง[1-9]ตัว


2

คุณอาจต้องการสิ่งนี้ (แก้ไข: allow number of the form 0123):

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

อย่างไรก็ตามถ้าเป็นฉันฉันจะทำแทน

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

1
ปัญหาสองประการ: สิ่งนี้ตรงกับ "123abc" ด้วยและส่งกลับ 123 และอาจทำให้เกิด ParseException
Daniel

@ แดเนียล: ฉันเดาว่าสิ่งนี้อาจถูกใช้ในรูปแบบการแยกวิเคราะห์ที่ใหญ่กว่าดังนั้นคุณจะมี regex / BNF ที่จับตัวเลขเท่านั้นและรหัสจาวาเพื่อตรวจสอบว่าตัวเลขที่จับได้นั้นไม่ใช่ค่าบวกที่เป็นศูนย์
Lie Ryan

@Daniel: ไม่ว่าในกรณีใดคุณยังคงต้องการข้อมูลเป็นจำนวนเต็มและไม่ช้าก็เร็วคุณยังต้องเรียก parseInt () หรือหมุน parseInt () ของคุณเอง
Lie Ryan

@ แดเนียล: Integer.parseInt()เพิ่มค่าใช้จ่ายน้อยมาก เป็นการขว้างปาและจับข้อยกเว้นที่มีราคาแพง
Alan Moore

@ ลี: ข้อตกลงกับ\\+?คำนำหน้าคืออะไร? ฉันเดาว่านั่นน่าจะเป็นเครื่องหมายบวก Escape เพราะมันจะปรากฏในซอร์สโค้ด Java แต่ทำไม? หากไม่อนุญาตให้ใช้เครื่องหมายลบฉันคิดว่ามันปลอดภัยที่จะถือว่าเครื่องหมายบวกหมดเช่นกัน
Alan Moore

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.