นิพจน์ทั่วไปของเลขฐานสิบโดยที่ตัวเลขหลังทศนิยมเป็นทางเลือก


113

ฉันต้องการนิพจน์ทั่วไปที่ตรวจสอบความถูกต้องของตัวเลข แต่ไม่ต้องการตัวเลขหลังทศนิยม กล่าวคือ.

123
123.
123.4

ทั้งหมดจะถูกต้อง

123..

จะไม่ถูกต้อง

ใด ๆ จะได้รับการชื่นชมอย่างมาก!


คำตอบที่ดีที่สุดอยู่ที่นี่: stackoverflow.com/a/39399503/715269
Gangnus

คำตอบ:


191

ใช้สิ่งต่อไปนี้:

/^\d*\.?\d*$/
  • ^ - จุดเริ่มต้นของบรรทัด;
  • \d* - 0 หลักขึ้นไป
  • \.?- จุดที่เป็นทางเลือก (Escape เนื่องจากใน regex .เป็นอักขระพิเศษ)
  • \d* - 0 หลักขึ้นไป (ส่วนทศนิยม);
  • $ - สิ้นสุดบรรทัด

สิ่งนี้ช่วยให้ได้ทศนิยม. 5 แทนที่จะต้องการศูนย์นำหน้าเช่น 0.5


2
@OrangeDog ตรงกับต้นฉบับของคุณมากกว่าที่คุณต้องการ เช่น 'cow3.45tornado';)
S. Albano

39
นอกจากนี้ยังจับคู่จุดเดียวซึ่งไม่ใช่เลขฐานสิบที่ถูกต้อง regex ที่ดีกว่าจะเป็นตัว/^\d*\.?\d+$/บังคับตัวเลขหลังจุดทศนิยม
Chandranshu

2
@Chandranshu และตรงกับสตริงว่างซึ่งการเปลี่ยนแปลงของคุณก็จะแก้ไขได้เช่นกัน
OGHaza

2
@Chandranshu "ไม่ต้องการตัวเลขหลังจุดทศนิยม"
OrangeDog

3
วิธีนี้ไม่ได้ผล มันต้องมีทศนิยมในขณะที่ OP พูดอย่างชัดเจนว่า: ทศนิยมที่เป็นทางเลือก
Alex G

114
/\d+\.?\d*/

ตัวเลขหนึ่งหลักขึ้นไป ( \d+), จุด ( \.?), ศูนย์หรือมากกว่าตัวเลข ( \d*)

ขึ้นอยู่กับการใช้งานหรือเอนจิ้น regex ของคุณคุณอาจต้องเพิ่มจุดยึดบรรทัดเริ่มต้น / สิ้นสุด:

/^\d+\.?\d*$/

การแสดงภาพนิพจน์ทั่วไป

Debuggex Demo


12
ใช่ แต่คำตอบที่ได้รับการโหวตสูงสุดไม่ถูกต้องตรงทั้งคู่.และสตริงว่างเปล่า
OrangeDog

1
@Gangnus ไม่ได้บอกว่า ".digit" ควรจะตรงกัน ถ้าพวกเขาต้องการสิ่งนั้นพวกเขาก็ควรจะพูด
OrangeDog

2
@EqualityInTech ฉันค่อนข้างแน่ใจว่ามันไม่ใช่ - มันไม่มีการรวมกลุ่มเลย
OrangeDog

1
อืม ... ฉันคิดว่าฉันอาจจะไม่เข้าใจ regexes ที่ชั่วร้ายอย่างที่คิด ขออภัย.
JDB ยังคงจำ Monica ได้ใน

1
@AlexanderRyanBaggett นี้ตรงกับสิ่งที่คำถามระบุ อย่างที่คุณเห็นมันไม่รวม-เลย
OrangeDog

74

คุณต้องมีนิพจน์ทั่วไปดังต่อไปนี้จึงจะทำได้อย่างถูกต้อง:

/^[+-]?((\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)

ตัวอย่างเช่นจะจับคู่:

  • 123
  • 23.45 น
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45 น
  • +516
  • +9.8
  • +2.
  • +.5

และจะปฏิเสธที่ไม่ใช่ตัวเลขเหล่านี้:

  • . (จุดทศนิยมเดียว)
  • -. (จุดทศนิยมติดลบ)
  • +. (บวกจุดทศนิยม)
  • (สตริงว่าง)

วิธีแก้ปัญหาที่ง่ายกว่านี้สามารถปฏิเสธหมายเลขที่ถูกต้องอย่างไม่ถูกต้องหรือจับคู่ตัวเลขที่ไม่ใช่เหล่านี้


1
ดีที่สุดเพราะตรงกับตัวเลขตามด้วยจุด (42. ) อย่างไรก็ตามมีข้อผิดพลาด / ผลบวกเท็จเนื่องจากตรงกับสิ่งนี้: 3 .... 3 ซึ่งสามารถแก้ไขได้โดยการเพิ่มวงเล็บอีกสองอันเพื่อบังคับใช้ ^ $ เริ่มต้นและอักขระสิ้นสุด: / ^ ([+ -]? (\ d + (\ . \ d *)?) | (\. \ d +)) $ /
Pete Alvin

1
ขอบคุณพีทเห็นดี คำตอบได้รับการแก้ไขแล้วโดยการเพิ่มวงเล็บพิเศษเพื่อให้ทำงานได้ตามที่ตั้งใจไว้ ตอนนี้เขียนเหมือน^A?(B|C)$. ก่อนหน้านี้เขียนเหมือน^A?B|C$ว่าจริงหมายถึง(^A?B)|(C$)ไม่ถูกต้อง หมายเหตุ: ^(A?B|C)$ก็ไม่ถูกต้องเช่นกันเพราะจริงๆแล้วหมายความว่า^((A?B)|(C))$ไม่ตรงกับ "+.5"
Hoylen

2
นี่คือคำตอบที่ดีที่สุด คำตอบอื่น ๆ ไม่สามารถใช้ได้กับทุกกรณี ฉันทำสิ่งที่คล้ายกันด้วยตัวเองยกเว้นว่าฉันใช้ lookahead เพื่อจัดการกับกรณีตัวเลขที่หายไป: /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey

1
นั่นคือ regex ที่ถูกต้องเท่านั้นที่นี่ แต่บางคนจะไม่เห็นด้วยกับ "34. " ฉันจะเสนอ + หลังจาก d ที่สองแทน *
Gangnus

1
สิ่งนี้ตรงกับ 0000.2 ด้วยซึ่งอาจไม่ใช่สิ่งที่ต้องการ
Aaron Zorel

12

ลอง regex นี้:

\d+\.?\d*

\ d + หลักก่อนทศนิยมที่เป็นทางเลือก
? ทศนิยมที่เป็นทางเลือก (เป็นทางเลือกเนื่องจาก? quantifier)
\ d * ตัวเลขทางเลือกหลังทศนิยม


1
ไม่อันนั้นไม่ตรงกัน123.
Bart Kiers

1
ขอบคุณสำหรับหมายเหตุ แก้ไข regex ของฉัน
Kash

4
อันที่จริง แต่ตอนนี้คุณเพิ่งแก้ไขเป็นสิ่งที่คนอื่นโพสต์ไว้แล้ว พิจารณาเพียงแค่ลบคำตอบที่ "ถูกต้อง" อื่นออก
Bart Kiers

@BartKiers ฉันเพิ่มคะแนนสิ่งนี้เนื่องจากคำตอบที่คุณอ้างถึงมีเครื่องหมายทับเพิ่มเติมในตอนต้นดังนั้นจึงไม่ได้ผลสำหรับฉัน สิ่งนี้ได้ผล
Edison

@ เอดิสันที่ทับเป็นตัวคั่น regex: ไม่ใช่ส่วนหนึ่งของรูปแบบเอง คุณจะเห็นคำตอบมากมายที่มีตัวคั่นเหล่านี้
Bart Kiers

10

ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุดเพราะตรงกับความต้องการทั้งหมด:

^\d+(\\.\d+)?$

1
สำหรับฉันนี่คือคำตอบที่ดีที่สุดเนื่องจากสตริง: "4. " (ตัวอย่าง) ไม่ใช่ตัวเลขที่ถูกต้องอย่างน้อยในภาษาทับทิม อย่างไรก็ตามคำตอบที่ได้รับการโหวตมากที่สุดยอมรับ "4" เป็น regex ตัวเลขซึ่งผิด
วิกเตอร์

3

ฉันใช้สิ่งต่อไปนี้:

^\d*\.?\d+$

สิ่งนี้ทำให้สิ่งต่อไปนี้ไม่ถูกต้อง:

.
3.

คุณอาจต้องใช้เครื่องหมายทับขึ้นอยู่กับภาษาที่คุณใช้ ตัวอย่าง: /^\d*\.?\d+$/
Charles Naccio

สิ่งนี้จะอนุญาต.3
Royi Namir

3

คุณสามารถใช้สิ่งนี้:

^\d+(\.\d)?\d*$

การแข่งขัน:
11
11.1
0.2

ไม่ตรงกับ:
.2
2.
2.6.9


ขอบคุณง่ายมากและตรงกับสิ่งที่ฉันต้องการ
Hany


2

นี่คือสิ่งที่ฉันทำ มีความเข้มงวดมากกว่าข้อใด ๆ ข้างต้น (และถูกต้องมากกว่าบางข้อ):

^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

2
^[+-]?(([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

และรายการเทียบเท่าที่ลงนามรวมทั้งสตริงว่าง


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

สะอาดและเรียบง่าย

สิ่งนี้ใช้คำต่อท้ายและคำนำหน้าคุณสมบัติ RegEx

ส่งคืนจริง - เท็จโดยตรงสำหรับเงื่อนไข IsMatch


1
^\d+(()|(\.\d+)?)$

มากับสิ่งนี้ อนุญาตทั้งจำนวนเต็มและทศนิยม แต่บังคับให้ใช้ทศนิยมทั้งหมด (ตัวเลขนำหน้าและตัวเลขต่อท้าย) หากคุณตัดสินใจที่จะใส่ทศนิยม


1

สิ่งที่คุณถามมีคำตอบแล้วดังนั้นนี่เป็นเพียงข้อมูลเพิ่มเติมสำหรับผู้ที่ต้องการทศนิยมเพียง 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: ไม่ตรง


ตรงกับตัวเลขติดลบหรือไม่
Alexander Ryan Baggett

1
@AlexanderRyanBaggett คุณต้องตรวจสอบเครื่องหมายลบจึงจะเป็น: ^ -? \ d + (\. \ d {2})? $
PersyJack

0

ใน 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]+))|))

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