Regex สำหรับตัวเลขเท่านั้น


309

ฉันไม่ได้ใช้นิพจน์ทั่วไปเลยดังนั้นฉันจึงมีปัญหาในการแก้ไขปัญหา ฉันต้องการให้ regex ตรงกันเฉพาะเมื่อสตริงที่มีอยู่เป็นตัวเลขทั้งหมด แต่ด้วยสองตัวอย่างด้านล่างมันจับคู่สตริงที่มีตัวเลขทั้งหมดรวมทั้งเครื่องหมายเท่ากับเช่น "1234 = 4321" ฉันแน่ใจว่ามีวิธีที่จะเปลี่ยนพฤติกรรมนี้ แต่อย่างที่ฉันพูดฉันไม่เคยทำอะไรมากกับการแสดงออกปกติ

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

ในกรณีที่เป็นเรื่องสำคัญฉันใช้ C # และ. NET 2.0


6
คุณต้องการจับคู่ตัวเลขหรือตัวเลขหรือไม่? ตัวอย่างเช่น: 123.456 เป็นตัวเลข แต่ไม่ใช่ตัวเลขทั้งหมด
Joel Coehoorn

ตรง OP ไม่ได้โดยสิ้นเชิงที่ชัดเจนเกี่ยวกับการใช้จำนวนเต็มหรือไม่
Sune Rievers

3
ทำไมไม่ลอง TryParse สตริงสำหรับเคสธรรมดา bool decimal.TryParse (สตริงสตริง, ผลลัพธ์ทศนิยม) หรือบูล int.TryParse (สตริงสตริง, ผลลัพธ์ int)
Makach

ดูคำตอบนี้สำหรับการแยกวิเคราะห์ตัวเลขด้วยนิพจน์ทั่วไป
tchrist

1
โดยทั่วไปแล้ววิธีที่ง่ายที่สุดในการแก้ไขปัญหานิพจน์ Regex ในความคิดของฉันคือการใช้ล่ามบรรทัดคำสั่งหากภาษาของคุณอนุญาตให้ใช้ (ดูเหมือนว่าส่วนใหญ่ทำ) เนื่องจากตัวอย่างนี้อยู่ใน C # คุณสามารถใช้linqpad.netหรือคุณสามารถใช้เบรกพอยต์ในดีบักเกอร์จากนั้นใช้หน้าต่าง Immediate ใน VS เป็น CLI
แอนดรูว์

คำตอบ:


478

ใช้จุดยึดเริ่มต้นและจุดสิ้นสุด

Regex regex = new Regex(@"^\d$");

ใช้"^\d+$"หากคุณต้องการจับคู่มากกว่าหนึ่งหลัก


โปรดทราบว่า"\d"จะตรงกับ[0-9]ตัวละครหลักอื่น ๆ ٠١٢٣٤٥٦٧٨٩เช่นเลขตะวันออกอาหรับ ใช้"^[0-9]+$"เพื่อ จำกัด การแข่งขันให้เหลือเพียงตัวเลขอารบิก 0 - 9


หากคุณต้องการที่จะรวมถึงการแสดงที่เป็นตัวเลขใด ๆ นอกเหนือจากตัวเลขเพียง (เช่นค่าทศนิยมสำหรับการเริ่ม) แล้วดู@tchrist 's คู่มือเพื่อแยกตัวเลขที่มีการแสดงออกปกติ


วิธีการเกี่ยวกับจำนวนที่ตั้งค่าตัวเลข? โดยปกติจะเป็นเช่นนี้สำหรับรหัสไปรษณีย์ของบางประเทศเช่นอินเดีย ฉันเดาว่าเราอาจต้องตรวจสอบความยาวสตริงหลังจากนี้
Najeeb

2
@Najeeb ใช่เนื่องจากรหัสไปรษณีย์ของอินเดียเป็นตัวเลข 6 หลักคุณจึงสามารถใช้งาน"^\d{6}$"ได้ บางประเทศอื่น ๆ มีกฎที่ซับซ้อนกว่าสำหรับรหัสไปรษณีย์ดังนั้นการแก้ปัญหา regex สำหรับหลาย ๆ ประเทศก็ค่อนข้างซับซ้อนเช่นกัน ดูตัวอย่างบางส่วนได้ที่stackoverflow.com/q/578406/1288
Bill the Lizard

ทำไมถ้าสตริงอินพุตมีลักษณะดังนี้: "3 a" มันจะยังคงตรงกัน? ไม่มีใครรู้ว่าฉันจะทำให้มันเข้าคู่กันได้เฉพาะในกรณีที่มีตัวเลขและไม่มีอะไรอื่น (ยกเว้นเครื่องหมายลบที่ฉันคิดว่า) ฉันตั้งค่ามันแบบนี้แล้ว "-? [0-9] +"
Matthew

105

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

regex = new Regex("^[0-9]+$");

^จะยึดจุดเริ่มต้นของสตริงที่$จะยึดท้ายของสตริงและ+จะตรงกับหนึ่งหรือมากกว่าหนึ่งของสิ่งที่นำหน้ามัน (จำนวนในกรณีนี้)


38

หากคุณต้องทนจุดทศนิยมและเครื่องหมายพัน

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

คุณจะต้องมีเครื่องหมาย "-" หากจำนวนสามารถเป็นลบได้


@ Florin Ghita ขอบคุณ "-" จะต้องอยู่ที่จุดเริ่มต้น
Andy

3
Regex นี้ยังอนุญาตให้เครื่องหมายลบ ( -) และระยะเวลา ( .) ที่ผิดพลาดเกิดขึ้นมากกว่าหนึ่งครั้ง
DavidRR

5
คุณสามารถสร้าง-และตัวเลือกผ่าน. จะจับคู่จำนวนเต็มหรือทศนิยม ( ใน parens เพียงแค่ทำให้ parens เป็นกลุ่มที่ไม่ถูกจับภาพและใช้เพื่อกลุ่มเพียงเพื่อความชัดเจน)?-?\d+(?:\.\d+)??:
butterywombat

2
มันล้มเหลวสำหรับเคสแบบขอบเช่น 1, .5 แต่ถ้าคุณดูแลมัน ยังคงล้มเหลวสำหรับกรณีพื้นฐานเช่น -2 โปรดแก้ไข^-?[0-9][0-9,\.]*$เพื่อหลีกเลี่ยงความล้มเหลวในกรณีพื้นฐาน + ถูกแทนที่ด้วย *
PrivateOmega

กรณีหนึ่งที่ฉันพลาดที่นี่คือสัญกรณ์วิศวกรรม (1.2345e-4) ข้อเสนอแนะใด ๆ เกี่ยวกับเรื่องนั้น?
WolfiG

18

มันกำลังจับคู่เพราะกำลังหา "การจับคู่" ไม่ใช่การจับคู่ของสตริงทั้งหมด คุณสามารถแก้ไขได้โดยเปลี่ยน regexp ของคุณเพื่อค้นหาจุดเริ่มต้นและจุดสิ้นสุดของสตริงโดยเฉพาะ

^\d+$

16

บางทีวิธีการของฉันจะช่วยคุณ

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
โปรดทราบว่าChar.IsDigitจะส่งคืนtrueอักขระที่เป็นสมาชิกของหมวดหมู่UnicodeCategory.DecimalDigitNumber นี่อาจไม่ใช่สิ่งที่ OP ต้องการ ดูเพิ่มเติมว่าทำไม Char.IsDigit ส่งกลับค่าจริงสำหรับตัวอักษรที่ไม่สามารถแยกวิเคราะห์เป็น int ได้ .
DavidRR


16

ใช้ได้กับเลขจำนวนเต็มและทศนิยม ไม่ตรงกับจำนวนที่มีตัวคั่นเครื่องหมาย coma thousand

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

สตริงที่ตรงกับสิ่งนี้:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

สตริงบางตัวที่ไม่:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.

11

^ \ d + $ ซึ่งเป็น "จุดเริ่มต้นของสตริง", "1 หลักหรือมากกว่า", "จุดสิ้นสุดของสตริง" เป็นภาษาอังกฤษ


10

หากคุณต้องการตรวจสอบว่าตัวเลขทั้งหมดเป็นตัวเลข (0-9) หรือไม่

^[0-9]+$

1425 จริง

0142 จริง

0 TRUE

1 TRUE

154a25 เท็จ

1234 = 3254 FALSE


10

นี่คือหนึ่งในการทำงานของฉัน:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

และการทดสอบบางอย่าง

การทดสอบเชิงบวก:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

การทดสอบเชิงลบ:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

ตรวจสอบไม่เพียง แต่สำหรับ C # แต่ยังรวมถึง Java, Javascript และ PHP


" 0.3" , "3". เป็นตัวเลขที่ดีจริง ๆ (หมายถึง 0.3 และ 3.0 ตามลำดับ) เราเห็นสิ่งนี้ตลอดเวลาในระบบต้นทางและฟังก์ชั่น to_number (xx) ส่วนใหญ่ของภาษาที่คุณพูดถึงจะรับรู้และแปลงอย่างถูกต้อง ขอบคุณ
Tagar

1
@Ruslan คุณถูกต้องในหลาย ๆ ระบบ ".3", "3." จะแยกเป็นหมายเลขที่ถูกต้องและใช้ตามที่คุณกล่าวถึง "0.3" และ "3.0" แต่ในทางกลับกัน - นั่นคือค่าที่แปลงแล้วดังนั้นค่าดั้งเดิม ".3" และ "3" ไม่ใช่ตัวเลขที่มีอยู่จริงๆ
Marina K.

9

ขออภัยที่จัดรูปแบบน่าเกลียด สำหรับตัวเลขใด ๆ :

[0-9]*

สำหรับหนึ่งหลักหรือมากกว่า:

[0-9]+

7

ในขณะที่การแก้ปัญหาข้างต้นไม่เหมาะสมกับวัตถุประสงค์ของฉันสิ่งนี้ได้ผลสำหรับฉัน

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

ตัวอย่างของค่าที่ถูกต้อง: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

ตัวอย่างของค่าที่ไม่ถูกต้อง: "a", "", ".", "-", "001", "00.2", "000.5", ".3", "3. ", "-1" , "--1", "-.1", "-0", "00099", "099"


4

อีกวิธีหนึ่ง: หากคุณต้องการจับคู่หมายเลขระหว่างประเทศเช่นเปอร์เซียหรืออาหรับดังนั้นคุณสามารถใช้นิพจน์ต่อไปนี้:

Regex = new Regex(@"^[\p{N}]+$");

เพื่อให้ตรงกับการใช้อักขระช่วงตัวอักษร:

Regex = new Regex(@"^[\p{N}\.]+$");


3

Regex สำหรับเลขจำนวนเต็มและเลขทศนิยม:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

ตัวเลขสามารถเริ่มต้นด้วยจุด (ไม่มีตัวเลขนำหน้า) และตัวเลขสามารถลงท้ายด้วยจุด (ไม่ต้องมีตัวเลขท้าย) regex ด้านบนจะรับรู้ทั้งตัวเลขที่ถูกต้อง

ก. (จุด) ตัวมันเองที่ไม่มีตัวเลขใด ๆ นั้นไม่ใช่ตัวเลขที่ถูกต้อง นั่นเป็นเหตุผลที่เราต้องการ regex สองส่วนนั่น (คั่นด้วย "|")

หวังว่านี่จะช่วยได้


1
นี่คือทางออกที่สมบูรณ์ที่สุด ยินดีด้วย!
Renato Medeiros

2

ฉันคิดว่าอันนี้ง่ายที่สุดและยอมรับวิธีการเขียนตัวเลขในยุโรปและอเมริกาเช่นสหรัฐอเมริกา 10,555.12 ยุโรป 10.555,12 นอกจากนี้อันนี้ไม่อนุญาตให้ใช้เครื่องหมายจุลภาคหรือจุดหลายจุดเช่นกัน 10..22 หรือ 10, .22 นอกจากตัวเลขนี้เช่น. 55 หรือ 55 จะผ่าน สิ่งนี้อาจมีประโยชน์

^([,|.]?[0-9])+$


-4

Regex regex = ใหม่ Regex ("^ [0-9] {1,4} = [0-9] {1,4] $")


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