ฉันต้องการนิพจน์ทั่วไปที่ตรวจสอบความถูกต้องของตัวเลข แต่ไม่ต้องการตัวเลขหลังทศนิยม กล่าวคือ.
123
123.
123.4
ทั้งหมดจะถูกต้อง
123..
จะไม่ถูกต้อง
ใด ๆ จะได้รับการชื่นชมอย่างมาก!
ฉันต้องการนิพจน์ทั่วไปที่ตรวจสอบความถูกต้องของตัวเลข แต่ไม่ต้องการตัวเลขหลังทศนิยม กล่าวคือ.
123
123.
123.4
ทั้งหมดจะถูกต้อง
123..
จะไม่ถูกต้อง
ใด ๆ จะได้รับการชื่นชมอย่างมาก!
คำตอบ:
ใช้สิ่งต่อไปนี้:
/^\d*\.?\d*$/
^
- จุดเริ่มต้นของบรรทัด;\d*
- 0 หลักขึ้นไป\.?
- จุดที่เป็นทางเลือก (Escape เนื่องจากใน regex .
เป็นอักขระพิเศษ)\d*
- 0 หลักขึ้นไป (ส่วนทศนิยม);$
- สิ้นสุดบรรทัดสิ่งนี้ช่วยให้ได้ทศนิยม. 5 แทนที่จะต้องการศูนย์นำหน้าเช่น 0.5
/^\d*\.?\d+$/
บังคับตัวเลขหลังจุดทศนิยม
/\d+\.?\d*/
ตัวเลขหนึ่งหลักขึ้นไป ( \d+
), จุด ( \.?
), ศูนย์หรือมากกว่าตัวเลข ( \d*
)
ขึ้นอยู่กับการใช้งานหรือเอนจิ้น regex ของคุณคุณอาจต้องเพิ่มจุดยึดบรรทัดเริ่มต้น / สิ้นสุด:
/^\d+\.?\d*$/
.
และสตริงว่างเปล่า
-
เลย
คุณต้องมีนิพจน์ทั่วไปดังต่อไปนี้จึงจะทำได้อย่างถูกต้อง:
/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/
นิพจน์เดียวกันกับช่องว่างโดยใช้ตัวปรับขยาย (ตามที่ Perl สนับสนุน):
/^ [+-]? ( (\d+ (\.\d*)?) | (\.\d+) ) $/x
หรือแสดงความคิดเห็น:
/^ # Beginning of string
[+-]? # Optional plus or minus character
( # Followed by either:
( # Start of first option
\d+ # One or more digits
(\.\d*)? # Optionally followed by: one decimal point and zero or more digits
) # End of first option
| # or
(\.\d+) # One decimal point followed by one or more digits
) # End of grouping of the OR options
$ # End of string (i.e. no extra characters remaining)
/x # Extended modifier (allows whitespace & comments in regular expression)
ตัวอย่างเช่นจะจับคู่:
และจะปฏิเสธที่ไม่ใช่ตัวเลขเหล่านี้:
วิธีแก้ปัญหาที่ง่ายกว่านี้สามารถปฏิเสธหมายเลขที่ถูกต้องอย่างไม่ถูกต้องหรือจับคู่ตัวเลขที่ไม่ใช่เหล่านี้
^A?(B|C)$
. ก่อนหน้านี้เขียนเหมือน^A?B|C$
ว่าจริงหมายถึง(^A?B)|(C$)
ไม่ถูกต้อง หมายเหตุ: ^(A?B|C)$
ก็ไม่ถูกต้องเช่นกันเพราะจริงๆแล้วหมายความว่า^((A?B)|(C))$
ไม่ตรงกับ "+.5"
ลอง regex นี้:
\d+\.?\d*
\ d + หลักก่อนทศนิยมที่เป็นทางเลือก
? ทศนิยมที่เป็นทางเลือก (เป็นทางเลือกเนื่องจาก? quantifier)
\ d * ตัวเลขทางเลือกหลังทศนิยม
123.
ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุดเพราะตรงกับความต้องการทั้งหมด:
^\d+(\\.\d+)?$
ฉันใช้สิ่งต่อไปนี้:
^\d*\.?\d+$
สิ่งนี้ทำให้สิ่งต่อไปนี้ไม่ถูกต้อง:
.
3.
.3
คุณสามารถใช้สิ่งนี้:
^\d+(\.\d)?\d*$
การแข่งขัน:
11
11.1
0.2
ไม่ตรงกับ:
.2
2.
2.6.9
ภาษาอะไร? ในสไตล์ Perl:^\d+(\.\d*)?$
นี่คือสิ่งที่ฉันทำ มีความเข้มงวดมากกว่าข้อใด ๆ ข้างต้น (และถูกต้องมากกว่าบางข้อ):
^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$
สตริงที่ผ่าน:
0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34
สตริงที่ล้มเหลว:
.
00000
01
.0.
..
00.123
02.134
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$
ควรสะท้อนถึงสิ่งที่คนมักคิดว่าเป็นเลขฐานสิบที่มีรูปแบบดี
ตัวเลขก่อนจุดทศนิยมอาจเป็นตัวเลขหลักเดียวในกรณีนี้อาจมีค่าตั้งแต่ 0 ถึง 9 หรือมากกว่าหนึ่งหลักซึ่งในกรณีนี้จะไม่สามารถเริ่มต้นด้วย 0 ได้
หากมีตัวเลขอยู่ก่อนเครื่องหมายทศนิยมให้ระบุทศนิยมและตัวเลขที่อยู่ข้างหลังเป็นตัวเลือก มิฉะนั้นจะต้องมีทศนิยมตามด้วยอย่างน้อยหนึ่งหลัก โปรดทราบว่าอนุญาตให้มี 0 ต่อท้ายหลายตัวหลังจุดทศนิยม
grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'
ตรงกับสิ่งต่อไปนี้อย่างถูกต้อง:
9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001
เช่นเดียวกับการลงนามที่เทียบเท่าในขณะที่ปฏิเสธสิ่งต่อไปนี้:
.
00
01
00.0
01.3
และรายการเทียบเท่าที่ลงนามรวมทั้งสตริงว่าง
(?<![^d])\d+(?:\.\d+)?(?![^d])
สะอาดและเรียบง่าย
สิ่งนี้ใช้คำต่อท้ายและคำนำหน้าคุณสมบัติ RegEx
ส่งคืนจริง - เท็จโดยตรงสำหรับเงื่อนไข IsMatch
^\d+(()|(\.\d+)?)$
มากับสิ่งนี้ อนุญาตทั้งจำนวนเต็มและทศนิยม แต่บังคับให้ใช้ทศนิยมทั้งหมด (ตัวเลขนำหน้าและตัวเลขต่อท้าย) หากคุณตัดสินใจที่จะใส่ทศนิยม
สิ่งที่คุณถามมีคำตอบแล้วดังนั้นนี่เป็นเพียงข้อมูลเพิ่มเติมสำหรับผู้ที่ต้องการทศนิยมเพียง 2 หลักหากป้อนจุดทศนิยมเพิ่มเติม:
^\d+(\.\d{2})?$
^: จุดเริ่มต้นของสตริง
\ d: ตัวเลข (เท่ากับ [0-9])
+: หนึ่งครั้งและไม่ จำกัด ครั้ง
จับภาพกลุ่ม (. \ d {2})?
เหรอ? : ศูนย์และหนึ่งครั้ง : ตัวละคร
\ d: ตัวเลข (เท่ากับ [0-9])
{2}: เท่ากับ 2 คูณ
$: จุดสิ้นสุดของสตริง
1: ตรง
123: ตรง
123.00: ตรง
123. : ไม่ตรง
123 .. : ไม่ตรง
123.0: ไม่ตรง
123.000: ไม่ตรง
123.00.00: ไม่ตรง
ใน Perl ใช้ Regexp :: Common ซึ่งจะช่วยให้คุณสามารถรวบรวมนิพจน์ทั่วไปที่ปรับแต่งอย่างละเอียดสำหรับรูปแบบตัวเลขเฉพาะของคุณ หากคุณไม่ได้ใช้ Perl โดยทั่วไปแล้วนิพจน์ทั่วไปที่สร้างขึ้นจะยังสามารถใช้กับภาษาอื่นได้
การพิมพ์ผลลัพธ์ของการสร้างนิพจน์ทั่วไปตัวอย่างใน Regexp :: Common :: Number:
$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))
$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))
$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))
ลองดู ^[0-9]\d{0,9}(\.\d{1,3})?%?$
มันผ่านการทดสอบและใช้ได้ผลสำหรับฉัน