จำเป็นหรือไม่ที่โปรแกรมเมอร์ทุกคนต้องเรียนรู้นิพจน์ทั่วไป [ปิด]


82

ฉันยังใหม่กับการเขียนโปรแกรมและในการสัมภาษณ์ฉันได้รับคำถามเกี่ยวกับการแสดงออกปกติ ไม่จำเป็นต้องพูดว่าฉันตอบไม่ได้ ดังนั้นฉันสงสัยว่าฉันควรเรียนรู้การแสดงออกปกติหรือไม่ มันเป็นสิ่งจำเป็นสำหรับโปรแกรมเมอร์ทุกสาขาหรือไม่? หรือมันเป็นสิ่งจำเป็นสำหรับการเขียนโปรแกรมสำหรับบางฟิลด์?

คำถามที่เกี่ยวข้อง:


55
ฉันเองรู้ว่าสิ่งที่พวกเขาเมื่อพวกเขาจะใช้และวิธีการของ Google ไวยากรณ์ ยักไหล่
Tyanna

35
มันเป็นสิ่งจำเป็นสำหรับผู้ใช้ระดับสูงทุกคน และโปรแกรมเมอร์จะต้องเป็นผู้ใช้ที่มีพลังเพื่อให้เกิดประโยชน์
SK-logic

8
ทำไมคุณไม่ต้องการที่จะเรียนรู้พวกเขา? คุณพบสถานการณ์อย่างน้อยหนึ่งสถานการณ์ที่คุณจะได้รับประโยชน์จากการรู้จักสถานการณ์เหล่านั้น มันไม่ได้เป็นเหตุผลที่คุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่คล้ายกันในอนาคต?
FishBasketGordo

23
เพียง แต่ผู้ที่ทำงานกับข้อความ :)
สตีฟแจ็คสัน

คำตอบ:


113

การแสดงออกปกติเป็นเครื่องมือที่สะดวกสบายอย่างไม่น่าเชื่อมีให้บริการในหลายภาษาที่นักพัฒนาส่วนใหญ่จะเรียนรู้ไม่ช้าก็เร็ว

สำหรับผู้สัมภาษณ์พวกเขาเป็นวิธีที่ดีในการสำรวจประสบการณ์ในระหว่างการสัมภาษณ์ หากคุณสัมภาษณ์คนที่อ้างว่ามีประสบการณ์นานหลายปีซึ่งไม่เข้าใจพวกเขาคุณต้องขุดลึกลงไปอีก


4
ฉันเห็นด้วยมันเป็นคำถามที่ดีสำหรับนักพัฒนาที่มีประสบการณ์ แต่การขอจบการศึกษาใหม่ที่ไม่มีประสบการณ์การทำงานเกี่ยวกับพวกเขาอาจไม่ยุติธรรมเล็กน้อยยกเว้นว่าพวกเขาต้องการกรองผู้สมัครที่ไม่มีประสบการณ์การเขียนโปรแกรมในทางปฏิบัติเลย
SK-logic

2
@ SK-logic: ขึ้นอยู่กับโรงเรียน เราทุกคนมีหลักสูตรบังคับในปีที่ 2 ซึ่งใช้การแสดงออกปกติค่อนข้างหนัก (ฉันยอมรับว่านั่นคือสิ่งที่ฉันติดอยู่กับพวกเขา;)) และมีหลักสูตรระดับอาวุโสมากกว่าสองสามหลักสูตรที่นำพวกเขากลับมาอีกครั้ง
FrustratedWithFormsDesigner

เห็นด้วยกับความคิดเห็นข้างต้น - ฉันจะไม่คาดหวังว่าใครบางคนออกจากโรงเรียนที่สดใหม่เพื่อจำเป็นต้องรู้การแสดงออกปกติ แต่ฉันก็ยังอาจถาม
ptyx

13
ฉันเป็นนักคณิตศาสตร์ดังนั้นฉันจึงไม่มีพื้นฐานด้านวิทยาศาสตร์คอมพิวเตอร์ แต่ฉันคิดว่า regexes ได้รับการสอนในหลักสูตรวิทยาลัยจริง ๆ ในขณะที่ปิดใช้งานไวยากรณ์ ฉันคาดหวังว่าคนที่เพิ่งออกจากวิทยาลัยจะมีความรู้ที่ดีกว่าซึ่งเป็นโปรแกรมเมอร์ที่มีประสบการณ์และไม่มีการศึกษา CS : - /
Andrea

8
@ Andrea เมื่อฉันอยู่ในมหาวิทยาลัย (BS ในวิทยาศาสตร์คอมพิวเตอร์) การแสดงออกปกติถูกครอบคลุมแน่นอนเมื่อเรียนรู้เกี่ยวกับไวยากรณ์และออโตมาตา อย่างไรก็ตามมันเป็นเพียงแนวคิดอย่างเป็นทางการที่ได้รับการคุ้มครองไม่ใช่การใช้งาน เราไม่ได้เรียนรู้ไวยากรณ์นิพจน์ปกติที่เข้ากันได้กับ POSIX หรือ Perl หรือวิธีใช้ในการเข้ารหัสของเรา เราเรียนรู้วิธีการวาดไดอะแกรมสถานะของออโตเมติก จำกัด เขียนว่าเป็นนิพจน์ทั่วไป ฯลฯ ตัวอักษรกรีกมีส่วนร่วมไม่ใช่ไฟล์ grep และข้อความ
Adam Jaskiewicz

54

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


19
นี่เป็นความจริงเช่นเดียวกับการบอกว่าการเข้าใจตรรกะบูลีนนั้นมีประโยชน์ แต่ไม่จำเป็น
Oded

1
@Oded: ฉันไม่พบการใช้ตรรกะบูลีนที่สอนในหลักสูตรของฉัน
DeadMG

16
@DeadMG ผมใช้ตรรกะแบบบูลตลอดเวลาเช่นในการแปลง: =>if (!(foo && bar)) if (!foo || !bar)บางทีคุณอาจเคยใช้มันและไม่ได้ตระหนักหรือคุณอาจยังไม่ได้สอนเนื้อหาที่ถูกต้อง
zzzzBov

7
ชอบการควบคุมเวอร์ชันไหม? หรือทดสอบซอฟต์แวร์?
Konrad Rudolph

2
@ruakh - ฉันยอมรับว่ามันมีประโยชน์มาก ฉันใช้มันตลอดเวลา ฉันคิดว่าโปรแกรมเมอร์ทุกคนควรเรียนรู้วิธีใช้ regexes ณ จุดหนึ่งในอาชีพของพวกเขา อย่างไรก็ตามคำถามไม่ได้ถามอย่างนั้น
eykanal

33

ฉันจะไม่แปลกใจถ้าเช่นโปรแกรมเมอร์เกมหรือโปรแกรมเมอร์ที่ LHC ไม่เคยเรียนรู้การแสดงออกปกติ ฉันอาจให้โปรแกรมเกมผ่านไม่รู้ SQL

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

ในทางกลับกันฉันไม่คาดหวังว่าโปรแกรมเมอร์ IS มาตรฐานของคุณจะรู้คณิตศาสตร์เมทริกซ์ที่โปรแกรมเมอร์เกมต้องการ มีระเบียบวินัยที่แตกต่างกันของโปรแกรมเมอร์ แต่เราต้องอยู่ภายใต้ร่ม "ระบบข้อมูล"


1
โปรแกรมเมอร์ที่ LHC อาจใช้นิพจน์ทั่วไปเพื่อค้นหาไฟล์ข้อมูลที่ผลิตโดยเซ็นเซอร์ โปรแกรมเมอร์เกมอาจใช้นิพจน์ทั่วไปเพื่อค้นหาไฟล์บันทึกที่สร้างโดยเกมของพวกเขา ตกลงพวกเขาอาจไม่ต้องทำ แต่มันอาจทำให้งานง่ายขึ้นมาก
FrustratedWithFormsDesigner

1
ฉันเห็นด้วย แต่ถ้าฉันสัมภาษณ์ตำแหน่งโปรแกรมเมอร์เกมฉันจะยังคงจ้างใครบางคนถ้าพวกเขาไม่รู้ว่านิพจน์ปกติคืออะไร หากฉันจ้างคนที่มีบทบาทในการเขียนโปรแกรมธุรกิจแบบดั้งเดิมซึ่งไม่รู้ว่าการแสดงออกปกติคืออะไรพวกเขาอาจจะไม่ได้รับการว่าจ้าง
Jonathan Rich

นั่นยุติธรรมฉันเดา
FrustratedWithFormsDesigner

7
นักฟิสิกส์ของอนุภาคส่วนใหญ่ทำงานในสภาพแวดล้อมที่เหมือนยูนิกซ์ แต่ก็เหมือนกับทุกอย่างที่เกี่ยวข้องกับคอมพิวเตอร์ในชุมชนนั้นทักษะส่วนใหญ่นั้นถ่ายทอดโดยปากเปล่า ระดับของความซับซ้อนใน regexps แตกต่างกันไป แต่เราไม่ค้นหาข้อมูลด้วย regexps: มีมากเกินไปและไม่ใช่ในรูปแบบข้อความ เราค้นหาบันทึกและเฉพาะกิจฐานข้อมูลและรหัสและเอกสารประกอบครึ่งเหมือนคนอื่น ๆ
dmckee

1
@FrustratedWithFormsDesigner ฉันจะไม่จ้างนักเขียนเกมที่ไม่รู้จัก regex การเขียนโปรแกรมเป็นข้อมูลมากธรรมชาติมากโดยไม่คำนึงถึงสนาม ไม่สำคัญว่าคุณจะทำอะไร - ในสาขาวิชาใดก็ตามที่คุณมีซอร์สโค้ดโปรแกรมแก้ไขข้อความที่สามารถใช้ regex และไฟล์บันทึกได้ หากไม่มี regex คุณจะมีประสิทธิภาพลดลงอย่างมากในการทำงานบางอย่าง (แม้ว่าคุณไม่จำเป็นต้องเขียน regex บรรทัดเดียวในเกมที่จัดส่ง) ฉันไม่ได้บอกว่า regex เป็นสิ่งจำเป็นสำหรับโปรแกรมเมอร์เกม ฉันแค่บอกว่าฉันจะไม่จ้างคนที่ไม่รู้จัก
Ben Lee

22

นิพจน์ทั่วไปเป็นวิธีที่สั้นมากในการแสดงวิธีจับคู่รูปแบบในข้อความ

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

พวกเขาเป็นเครื่องมือที่ดีที่มีในกล่องเครื่องมือของคุณและฉันคาดหวังว่าโปรแกรมเมอร์ผู้มีประสบการณ์จะรู้วิธีใช้

หนึ่งในแหล่งข้อมูลที่ดีที่สุดที่จะเรียนรู้เกี่ยวกับการแสดงออกปกติเป็นหนังสือเจฟฟรี Friedl ของMastering นิพจน์ปกติ มันค่อนข้างก้าวหน้าดังนั้นคุณอาจต้องการอ่านจริง ๆ เมื่อคุณมีประสบการณ์มากขึ้น

คุณสามารถเริ่มต้นกับการกวดวิชาที่regular-expressions.info


2
นี่เป็นเรื่องของรสนิยมสำหรับฉัน ฉันไม่เคยต้องการพวกเขาจริงๆ ฉันใช้มันในหลายโครงการดังนั้นฉันจึงรู้ว่าพวกเขาทำงานอย่างไร แต่ฉันสามารถทำได้โดยที่ไม่ต้องทำและเห็นว่าพวกเขาใช้งานในทางที่ผิดบ่อยกว่าที่ฉันรู้สึกต้องการ หากต้องการรูปแบบที่เรียบง่ายและคุณอาจใช้การจัดการสตริงกับคอมเพล็กซ์และใช้งานได้เร็วขึ้น (e) BNF อย่างน้อยถ้าคุณชอบฉันก็คุ้นเคยกับการทำงานกับ parsers
Rune FS

15

ตรงกันข้ามกับคำตอบส่วนใหญ่ที่นี่ฉันไม่คิดว่าความรู้เกี่ยวกับ reg exs เป็นทักษะที่จำเป็นสำหรับการเป็นโปรแกรมเมอร์ที่มีประสิทธิผล เมื่อฉันสัมภาษณ์ผู้สมัครในตำแหน่งที่ฉันจะขุดลึกลงไปถ้าพวกเขารู้สึกว่าถูกบังคับให้นำทักษะของพวกเขาจากอดีตขึ้นพวกเขา ทำไม? พวกเขามักจะใช้ในสถานที่เพราะพวกเขาชอบค้อนที่ถูกต้อง แต่บ่อยครั้งสิ่งที่คุณต้องการคือไขควง ค้นหา SO สำหรับ HTML และ regex แล้วคุณจะเห็นคำถามสองสามข้อและเหตุผลสองสามข้อว่าทำไม regex ถึงไม่เหมาะสม

ความสามารถในการทำ OOD ที่ถูกต้องเป็นสิ่งจำเป็นก่อนที่ฉันจะสนับสนุนการจ้างผู้สัมภาษณ์ความรู้เกี่ยวกับการแสดงออกปกติไม่แน่นอน และฉันไม่คิดว่ามีใครเชื่อว่าคุณสามารถเป็นโปรแกรมเมอร์ที่มีประสิทธิผลมากกว่าที่รู้ว่า regexs แต่ขาดในด้านต่าง ๆ เช่นการวิเคราะห์การออกแบบและความรู้เกี่ยวกับกรอบที่ใช้

แน่นอนว่าบางครั้งมันมีประโยชน์ แต่ใน 20 ปีของฉันในฐานะนักพัฒนามืออาชีพฉันคิดว่าฉันใช้รหัสน้อยกว่า 20 ครั้ง (และฉันยังใช้โค้ดสคริปต์ Perl ไม่กี่ครั้ง) ฉันใช้มันเป็นประจำเพื่อทำการค้นหาและ แทนที่แม้ว่า


โปรแกรมเมอร์ที่ไม่ทราบว่านิพจน์ทั่วไปมักจะสร้างกองใหญ่ของ WTF เมื่อนิพจน์ปกติจะทำงานได้ดีมาก โปรแกรมเมอร์ที่รู้เฉพาะนิพจน์ทั่วไปมักจะสร้างกองขนาดเล็ก แต่ไม่ใหญ่โตของ WTF ที่พยายามประมวลผลภาษาที่ไม่ปกติ (เช่น HTML) ด้วยนิพจน์ทั่วไป
วินไคลน์

14

ไม่ว่าคุณจะทำงานกับโดเมนใดก็ตามนิพจน์ทั่วไปเป็นเครื่องมือที่มีประโยชน์ที่ควรทราบเนื่องจากภาษาการเขียนโปรแกรมส่วนใหญ่เขียนเป็นข้อความธรรมดา Regex เป็นวิธีที่ยอดเยี่ยมในการจัดการและปรับเปลี่ยนซอร์สโค้ดของคุณและสร้างขึ้นในเครื่องมือแก้ไขข้อความจำนวนมาก ฉันได้เห็นโปรแกรมเมอร์จำนวนนับไม่ถ้วนทำการเปลี่ยนแปลงซ้ำกับไฟล์ต้นฉบับเมื่อนิพจน์ปกติจะทำการเปลี่ยนแปลงอย่างรวดเร็วและแม่นยำมากขึ้น

นี่คือสิ่งที่บทที่ 3 ของ Pragmatic Programmer พูดถึงด้วยข้อความธรรมดาว่าเป็น "วัตถุดิบพื้นฐานของการเขียนโปรแกรม"


ทำไมคุณไม่ใช้ IDE ที่สนับสนุนการรีแฟคเตอร์?
NimChimpsky

2
หากฉันได้ถามคำถามในโพสต์นี้ฉันจะให้เครื่องหมายถูกกับคุณ นี่คือเหตุผลที่สำคัญที่สุดเพียงอย่างเดียวที่ฉันจะไม่จ้างคนที่ไม่รู้จัก regex มันเป็นเครื่องมือแก้ไขและค้นหารหัสที่ทรงพลังแม้ว่าคุณจะไม่จำเป็นต้องเขียนรหัสบรรทัดเดียวที่ใช้งานก็ตาม บางคนที่ไม่รู้ว่ามันจะเป็นคำสั่งขนาดที่มีประสิทธิภาพน้อยกว่าในงานประจำวันบางอย่าง
Ben Lee

10

Jeff Atwood เขียนบล็อกที่ยอดเยี่ยมเกี่ยวกับการแสดงออกปกติในนั้นมีคำพูดที่น่าอัศจรรย์นี้:

Some people, when confronted with a problem, think "I know, I'll use regular 
expressions." Now they have two problems. [Jamie Zawinski]

นอกจากนี้ยังมีคำตอบที่ดีสำหรับคำถามที่ดีเช่นกันสแต็คล้นที่คุณอาจต้องการตรวจสอบ

คุณควรจะรู้เล็กน้อยเกี่ยวกับเรื่องนี้ นิพจน์ทั่วไปนั้นง่ายต่อการเรียนรู้ แต่ยากที่จะเข้าใจ คุณไม่จำเป็นต้องเรียนรู้ทุกอย่างเกี่ยวกับมันเพื่อเริ่มใช้มัน เพียงมีสติเกี่ยวกับเรื่องนี้

 

TL; DR

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


8

ฉันทำงานในฐานรหัสแบบฝังที่ไม่มีไลบรารีนิพจน์ทั่วไป งานบางอย่างจำเป็นต้องใช้โค้ด 275 บรรทัดและใช้เวลาประมาณสองสัปดาห์ในการดีบักเคสมุมทั้งหมดกลับไปกลับมาระหว่างผู้ทดสอบและผู้พัฒนา ฉันภายหลังเขียนฟังก์ชันเพื่อทำสิ่งเดียวกันกับส่วนหนึ่งของยูทิลิตี javascript แน่นอนงานเดียวกันใช้นิพจน์ปกติใช้ 10 บรรทัดของรหัสและทำงานอย่างสมบูรณ์แบบในรอบ 15 นาที

คุณต้องการนิพจน์ทั่วไปหรือไม่ ไม่ใช่ในทางเทคนิค แต่มันโง่ที่จะจงใจไม่รู้เครื่องมือที่มีประสิทธิภาพ


6

เพื่ออ้างอิงคำตอบอื่น:

นิพจน์ทั่วไปเป็นวิธีที่สั้นมากในการแสดงวิธีจับคู่รูปแบบในข้อความ

ดังนั้นหากนี่เป็นส่วนสำคัญของงานของคุณอาจเป็นวิธีที่ดีกว่าในการออกแบบระบบที่คุณกำลังพัฒนา เว้นแต่จะมีข้อความจำนวนมากเป็นโดเมนเฉพาะสำหรับพื้นที่ของคุณ (เช่นชีวสารสนเทศศาสตร์)

ฉันทำงานในระบบขององค์กรต่าง ๆ สามระบบ (ใน บริษัท ต่าง ๆ สามแห่งในระยะเวลาสิบปี) และฉันเขียนมันน้อยกว่าห้าครั้งและนั่นรวมถึงการคัดลอกและวางโปรแกรมตรวจสอบอีเมลพื้นฐานสองครั้ง


2
ข้อความจำนวนมากเป็นโดเมนเฉพาะเสมอ คุณเป็นโปรแกรมเมอร์หลังจากทั้งหมด ข้อความ (ในรูปแบบของซอร์สโค้ด) คือโดเมนของคุณ การจัดการข้อความอย่างมีประสิทธิภาพด้วยนิพจน์ทั่วไปทำให้คุณเป็นโปรแกรมเมอร์ที่มีประสิทธิภาพมากขึ้น
วอนตัม

2
@quanticle ที่ไม่สมเหตุสมผล คุณจัดการกับซอร์สโค้ดของคุณด้วยนิพจน์ทั่วไปหรือไม่ ฟังดูเหมือนฝันร้ายแน่นอน นิพจน์ทั่วไปเป็นส่วนหนึ่งของรหัสและรหัสของคุณโต้ตอบกับข้อมูลเฉพาะโดเมน
NimChimpsky

3
ฉันจัดการกับซอร์สโค้ดด้วยนิพจน์ทั่วไป การปรับเปลี่ยนโค้ดขนาดใหญ่ด้วยมือนั้นน่าเบื่อและมีข้อผิดพลาดได้ง่าย การใช้โปรแกรมแก้ไขที่รองรับการค้นหาและแทนที่นิพจน์ทั่วไป (คำใบ้: สวยมากเครื่องมือแก้ไขทุกตัวรองรับการค้นหาและแทนที่ด้วย regexp) ทำให้การปรับโครงสร้างทำได้ง่ายขึ้นมาก
วอนตัม

3
@Dunk เขาไม่ได้บอกว่ามันเป็นการเพิ่มประสิทธิภาพอย่างมีนัยสำคัญตลอดอายุการใช้งานของโครงการ แต่มันอาจจะเป็นการเพิ่มขึ้นอย่างมากในช่วงระยะเวลาสั้น ๆ ฉันได้ทำการปรับโครงสร้างใหม่อีกครั้งโดยมีการเปลี่ยนแปลงหลายร้อยถึงพันครั้งในหลายสิบไฟล์ ในช่วงชีวิตของโครงการเวลาที่บันทึกไว้นั้นไม่มีนัยสำคัญ แต่ฉันไม่ต้องการใช้เวลาหรือวันเพื่อที่จะทำการเปลี่ยนแปลงแบบเดียวกันด้วยมือแน่นอน Modern IDE's สามารถทำสิ่งนี้ให้คุณได้โดยที่คุณไม่ต้องเขียน regex แต่บางครั้งมันก็ไม่สามารถทำได้
jmoreno

2
@NimChimpsky Regexps ทำงานได้ทุกที่ IDEs และเครื่องมือการเปลี่ยนโครงสร้างใหม่ทำงานเฉพาะกับภาษาที่ระบุเท่านั้น ตัวอย่างเช่นเครื่องมือการปรับโครงสร้างใหม่ของคุณจะอนุญาตให้ฉันผ่านเทมเพลตทั้งหมดของฉันและค้นหา / ลบสตริงที่ดูเหมือนหมายเลขโทรศัพท์ ( sites.google.com/site/steveyegge2/… ) หรือไม่
วอนตัม

4

นิพจน์ทั่วไปสามารถใช้เป็นเครื่องมือในการประมวลผลข้ามภาษาข้ามแพลตฟอร์ม ฉันสามารถใช้ regex ในรหัสของฉันฉันสามารถใช้ regex ในโปรแกรมแก้ไขของฉันฉันสามารถใช้ regex บน commandline!

ไม่ใช่แค่ที่คุณต้องการหรือควรเรียนรู้พวกเขา มันเป็นเช่นนั้นมากขึ้น

ว้าว! ฉันรัก REGEX!


4

คุณไม่จำเป็นต้องรู้สิ่งที่ regex เล็ก ๆ น้อย ๆ ด้วยใจเพื่อที่จะได้เป็นโปรแกรมเมอร์ที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งเนื่องจากพวกมันมักจะมีความแตกต่างกันเล็กน้อยเกี่ยวกับการใช้งานที่แตกต่างกันและภาษาการเขียนโปรแกรม สิ่งที่คุณไม่จำเป็นต้องรู้คือ

  • นิพจน์ทั่วไปและ regexes คืออะไร
  • สิ่งที่พวกเขาทำอย่างมีประสิทธิภาพ (แยกภาษาปกติ)
  • สิ่งใดเป็นสิ่งที่ไม่มีประสิทธิภาพ (แยกวิเคราะห์สิ่งที่ซ้อนกันโดยใช้การอ้างอิงย้อนหลัง)
  • จะรับข้อมูลเกี่ยวกับไวยากรณ์ได้ทุกเมื่อที่คุณต้องการอ่านหรือเขียน

อย่างไรก็ตามคุณไม่ต้องกังวลมากนักเกี่ยวกับเรื่องนี้มันต้องใช้ความพยายามมากเกินไปในการเรียนรู้พวกเขาตั้งแต่แรก ผู้ประกอบการที่ง่าย ( ., *, |, ()ฯลฯ ) เกือบปัจจุบันในระดับสากลและไปนานทาง!


ฉันคิดว่านี่เป็นจุดที่ดีจริงๆ การรู้จักวิธีใช้การอ้างอิงย้อนกลับและคุณสมบัติขั้นสูงอื่น ๆ ของเอ็นจิน RE บางตัวนั้นมีประโยชน์ในระดับปานกลางเท่านั้น ในหลายกรณีส่วนใหญ่การรวมการใช้ REs เข้ากับตรรกะเล็กน้อยจะสามารถอ่านได้ง่ายขึ้นและง่ายต่อการดูแลรักษา
Mark Bessey

3

ตามที่กล่าวไว้แล้วRegex เป็นเครื่องมือเป็นเครื่องมือที่มีประโยชน์มาก IMHO

ลองพิจารณาตัวอย่างนี้:

//fomat number using string.replace and regex in javascript
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
} 

เพียงหนึ่งบรรทัดในการแปลงเช่นตัวเลขเช่น 1000000.00 นี้เป็น "1,000,000.00"

การใช้วิธีการอื่นจะซับซ้อนกว่านี้มาก


2
และนี่ไม่ซับซ้อนใช่ไหม สิ่งนี้ใช้คุณสมบัติพิเศษหลายอย่างที่ไม่ได้อยู่ในชุด regex มาตรฐาน ความยาวที่เรียบง่ายและการเติมจะทำได้ดีสำหรับสิ่งนี้
เฟืองวงล้อ

2

มันไม่จำเป็นต้อง คุณเพียงแค่ต้องตระหนักถึงการมีอยู่ของพวกเขาและเวลาที่จะใช้พวกเขา ข้อมูลจำเพาะของไวยากรณ์นั้นง่ายต่อการค้นหาและทำให้ถูกต้องโดยใช้ Google และเครื่องมือออนไลน์


2

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

โปรแกรมเมอร์ที่แท้จริงรู้ถึงการแสดงออกปกติของพวกเขา

นี่เป็นความเอนเอียงเล็กน้อยเนื่องจากฉันส่วนใหญ่เกี่ยวข้องกับการเขียนโปรแกรมเว็บซึ่งการแสดงผลปกติเป็นสิ่งที่คุณต้องเจออย่างมากทั้งในฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ หากคุณเป็นโปรแกรมเมอร์แอสเซมบลีสำหรับระบบที่มีอยู่แล้วในเครื่องล้างจานคุณอาจไม่ต้องเจอกับนิพจน์ทั่วไปเลย แต่มันก็อาจจะมีประโยชน์เพราะคุณส่วนใหญ่สามารถใช้สภาพแวดล้อมการพัฒนาของคุณเมื่อคุณรู้จักนิพจน์ทั่วไป (ค้นหาและแทนที่, ค้นหาไฟล์, ค้นหาไฟล์หลายไฟล์ ฯลฯ )

นอกจากนี้คุณจะพบว่าการได้รับการยอมรับจากเพื่อนโปรแกรมเมอร์ถ้าคุณรู้


นอกจากนี้ยังเป็นเรื่องที่ไร้ประโยชน์ที่จะเรียนรู้รายละเอียดทั้งหมดด้วยหัวใจในตอนแรกเนื่องจากมีภาษาที่แตกต่างกันมากมาย ให้พยายามจดจ่อกับการเรียนรู้พื้นฐาน: (1) สร้าง regexps ง่าย ๆ สองสามอย่างแล้วเรียนรู้ความหมายของ * + {} [] () และ - และคลาสพื้นฐานเล็กน้อย (2) ด้วยสเป็คที่ระบุไว้ในมือของคุณพยายามที่จะเข้าใจสิ่งที่เกิดขึ้นในภาคผนวกที่คุณเจอ
Aron Cederholm

คุณใช้อะไร exps reg สำหรับในปี dev เว็บ มันเป็นสิ่งที่ฉันทำและฉันใช้มาแล้ว 5 ครั้งในระยะเวลา 10 ปี +
NimChimpsky

สำหรับผู้เริ่มต้น: การแยกวิเคราะห์หรือตรวจสอบการป้อนข้อมูลของผู้ใช้ (เช่นอีเมลรหัสไปรษณีย์ / รหัสไปรษณีย์แบบฟอร์มการค้นหาผู้ใช้) แต่สำหรับวัตถุประสงค์ I18n และ l10n สำหรับสตริงการแปลที่กำหนดเองและตัวแปรในหลายภาษา / โลแคล และพวกเขาก็มาช่วยด้วยการตรวจจับข้อผิดพลาดและการจัดการข้อผิดพลาดค่อนข้างมาก และในโลก CMS / บล๊อก / คอมเม้นท์สำหรับ wiki / เวทีมาร์กอัป สำหรับข้อมูลภายนอก (อินพุตของผู้ใช้, หน้าเว็บที่ถูกคัดลอก, ทรัพยากรที่ถูกซิงก์ ฯลฯ ) การแยกวิเคราะห์และจัดการเนื้อหา / ลิงก์ / อะไรก็ตาม นอกจากนี้เพื่อวัตถุประสงค์ด้านสถิติและการบันทึกข้อมูลจำนวนมาก (การตรวจจับเบราว์เซอร์การเรียงลำดับผู้อ้างอิง ... )
Aron Cederholm

-1 สำหรับความคิดเห็นที่โง่เขลา "โปรแกรมเมอร์จริง ๆ ... "
Dunk

มันเป็นวิธีที่ค่อนข้างตื้นในการตรวจสอบการป้อนข้อมูลของผู้ใช้และฉันจะแปลกใจถ้า regex ของคุณถูกต้อง 100% (การตรวจสอบอีเมลเป็นชื่อที่มีชื่อเสียง) และฉันไม่ได้มองหา "สตริงการแปลที่กำหนดเองและตัวแปรในหลายภาษา / โลแคล" ที่คุณแปลระหว่างภาษาโดยใช้ regex - er wtf จุดประสงค์ด้านสถิติ - คุณมีสถิติด้วยนิพจน์ทั่วไปหรือไม่ การเชื่อมโยงการเขียนใหม่ / เนื้อหาที่มี regexs ดูเหมือนรหัสกลิ่นให้ฉัน
NimChimpsky

1

มันเป็นสิ่งจำเป็นหรือไม่? คุณรู้อยู่แล้วว่าคุณต้องรู้อะไร: พวกเขามีอยู่แล้วพวกเขาคืออะไรและพวกเขาใช้อะไร งานของคุณในฐานะโปรแกรมเมอร์คือการแก้ปัญหา ตอนนี้คุณรู้พอที่จะเริ่มแยกพวกเขาออกเป็นวิธีการแก้ปัญหาของคุณ คุณควรเรียนรู้ regexs หรือไม่ อย่างแน่นอน ลำดับความสำคัญขึ้นอยู่กับคุณ ... มีงานที่พวกเขาจะถูกใช้ทุกวันและงานที่พวกเขาจะไม่ถูกใช้ คำแนะนำง่ายๆจะเป็นรูปแบบที่ตรงกับปัญหาที่คุณคาดหวังว่าจะต้องเจอ


1

อืมฉันต้องคั่นด้วยจุลภาคและส่งออกรายการสตริงนี้ให้ฉันเขียนฟังก์ชั่นที่มีการวนรอบที่ใช้อาร์กิวเมนต์ตัวคั่นและต่อท้ายเข้าด้วยกัน ... หรือฉันสามารถใช้คำสั่ง 'เข้าร่วม' ที่มีอยู่นี้

ฉันต้องการเรียงลำดับไปยังวัตถุที่ซับซ้อนเหล่านี้ตามคุณลักษณะสองอย่างที่แต่ละวัตถุมีให้ฉันเตือนตัวเองถึงวิธีเขียนฟังก์ชันการเรียงลำดับที่ทำอย่างนั้นไม่ต้องรอฉันสามารถใช้ฟังก์ชันการเรียงมาตรฐานที่มีอยู่ในภาษานี้ได้ ฉันจะต้องเรียนรู้วิธีการเขียนเครื่องมือเปรียบเทียบแบบกำหนดเอง แต่ไม่ควรยากเกินไปมันชัดกว่าการรักษาฟังก์ชั่นการเรียงลำดับของตัวเอง

ฉันรู้สึกกลัวเล็กน้อยกับแนวคิดวิธีเสมือนจริง แต่มันจะช่วยฉันลดรายการเหล่านี้แต่ละรายการสำหรับรายการประเภทต่าง ๆ ลงไปในรายการเดียว จากนั้นฉันไม่ต้องเขียนคำสั่งที่คล้ายกันครึ่งโหลในการประมวลผลแต่ละรายการด้วยวิธีที่แตกต่างกัน คิดว่าฉันควรเรียนอย่างหนักและเรียนรู้สิ่งเหล่านั้นเพราะรหัสของฉันจะง่ายและสะอาดขึ้นถ้าฉันทำเช่นนั้น

ฉันต้องการแยกจากไฟล์ข้อความนี้คำและค่าเหล่านี้ท่ามกลางเสียงรบกวนอื่น ๆ ทั้งหมดนี้ให้ฉันเขียน parser ห้าสิบบรรทัดเพื่ออ่านตัวอักษรทีละตัวและถ้าตัวละครตัวหนึ่งดูเหมือนว่าจุดเริ่มต้นของฉัน กำลังมองหาฉันจะตั้งค่าตัวแปรสถานะนี้และเริ่มการแยกวิเคราะห์มันแตกต่างกันไปเรื่อย ๆ ... แน่นอนว่ากรณีของฉันชัดเจนว่าไม่มีใครพิเศษได้เจอปัญหาแบบนี้มาก่อนและคิดค้นวิธีแก้ปัญหาทั่วไปที่ใช้หนึ่งบรรทัด ของรหัสที่ต้องทำ นั่นทำให้ฉันนึกว่าฉันควรเอาหนังสือเขียนโปรแกรมเหล่านั้นที่ฉันไม่เคยอ่านมาที่ร้านหนังสือมือสอง


1

คำตอบสั้น ๆ : ไม่ แต่ .... ความรู้คือพลัง

ฉันเป็นนักพัฒนาเว็บและฉันพบนิพจน์ทั่วไปที่ฉันต้องการโดยทั่วไปได้ถูกเขียนขึ้นสำหรับฉัน อย่างไรก็ตามฉันมีปัญหาเกี่ยวกับการคัดลอกและวางและไม่ทราบว่ากำลังทำอะไรอยู่หรือไม่ซึ่งเป็นอันตรายจากการคัดลอกและวางสิ่งใด ๆ

ตัวอย่างหนึ่ง: regex อีเมลที่ฉันคัดลอกและวางไม่อนุญาตเป็นระยะเวลาหรือบวกในอีเมลที่ได้รับอนุญาตในข้อมูลจำเพาะที่อยู่อีเมล ในความเป็นจริงหลายคนใช้ gmail กับ actualemail+sitename@gmail.com เพื่อให้ง่ายต่อการกรอง 'ชื่อผู้ใช้' หากพวกเขาเลือกที่จะสแปม


0

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

แต่ในการตรวจสอบของ formulars หรือข้อมูลที่มีประโยชน์มาก ฉันคิดว่าสุดยอดทุกรูปแบบมืออาชีพได้รับการตรวจสอบกับ regex ASP.NET ใช้มัน

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


0

ขึ้นอยู่กับพื้นที่ / แพลตฟอร์มที่คุณกำลังทำงาน

  1. สำหรับแอปพลิเคชันเดสก์ท็อปคุณสามารถใช้ชีวิตคูลได้โดยไม่ต้องรู้อะไรเกี่ยวกับนิพจน์ทั่วไป แต่ใจคุณ Visual Studio มีการค้นหานิพจน์ปกติ แต่ฉันสงสัยว่าใครใช้เป็นประจำ ฉันไม่คิด (คุณต้องแก้ไขการแสดงออกปกติของคุณก่อนเพราะคุณสามารถค้นหา :))

  2. ในฐานะนักพัฒนาเว็บคุณมักจะต้องเรียนรู้นิพจน์ปกติ คุณสามารถหลีกเลี่ยงได้เพราะคุณสามารถค้นหาข้อมูลโค้ดออนไลน์ที่จะพอเพียงที่คุณต้องการ แต่การเรียนรู้จะช่วยได้

มีพื้นที่เช่นเอกสารประกอบคดีความทางกฎหมายที่นิพจน์ทั่วไปเป็นเครื่องมือที่ขาดไม่ได้ คุณต้องรู้ ถ้าคุณไม่ทำคุณก็จะไม่ได้งาน

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


0

นิพจน์ทั่วไปเป็นเครื่องมือที่มีประโยชน์มากและมีสถานการณ์มากมายเมื่อโปรแกรมเมอร์ควรใช้มัน คุณไม่ควรเรียนรู้ทุกอย่างด้วยใจ เพียงใช้การอ้างอิงและทำงานของคุณ หลังจากงาน 10-20-50-100 (ขึ้นอยู่กับโปรแกรมเมอร์) ที่คุณใช้นิพจน์ปกติคุณจะรู้จักพวกเขาทั้งหมดด้วยใจ พวกเขากำลังเรียนรู้ด้วยตัวเองคุณไม่ควรเรียนรู้เป็นพิเศษ


0

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

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

พวกเขาสามารถเข้าใจการแจงโดยทั่วไปได้ดีขึ้นซึ่งมีประโยชน์สำหรับการเขียนโปรแกรมทุกประเภทและเข้าใจวิธีการใช้เครื่องมือที่เราใช้เป็นประจำ (คอมไพเลอร์บรรณาธิการเบราว์เซอร์ ฯลฯ )

ประโยชน์เชิงปฏิบัติของการใช้นิพจน์ทั่วไปนั้นมีจำนวนมหาศาล แม้ว่าคุณจะไม่ "โปรแกรม" กับพวกเขา - ฉันใช้นิพจน์ทั่วไปที่ค้นหา / แทนที่ในเครื่องมือแก้ไขของฉันตลอดเวลาและวัดว่าพวกเขาทำให้ฉันมีประสิทธิผลมากขึ้นเพียงใด

ดังนั้นในขณะที่ไม่จำเป็นฉันคิดว่ามันเป็นหนึ่งในเครื่องมือแรกที่โปรแกรมเมอร์ควรเรียนรู้


0

Rob Pike ไม่คิดอย่างนั้น :

นิพจน์ทั่วไปยากที่จะเขียนยากที่จะเขียนได้ดีและอาจมีราคาแพงเมื่อเทียบกับเทคโนโลยีอื่น ๆ เทคนิคการเขียนและแยกวิเคราะห์แบบมาตรฐานนั้นเขียนได้ง่ายมากทั่วไปและปรับได้ดังนั้นจึงไม่มีเหตุผลที่จะใช้นิพจน์ทั่วไป

อีกวิธีในการดูคือ lexers และ parsing จับคู่รูปแบบที่กำหนดไว้แบบคงที่ แต่ความแข็งแกร่งของนิพจน์ทั่วไปคือพวกมันมีวิธีแสดงรูปแบบแบบไดนามิก พวกมันยอดเยี่ยมในเครื่องมือแก้ไขข้อความและเครื่องมือค้นหา แต่เมื่อคุณรู้เวลารวบรวมสิ่งต่าง ๆ ที่คุณกำลังมองหานิพจน์ทั่วไปจะนำความมีชีวิตชีวาและความยืดหยุ่นมากกว่าที่คุณต้องการ

การสนับสนุนการแสดงออกปกติเป็นยาครอบจักรวาลสำหรับปัญหาการประมวลผลข้อความทั้งหมดไม่เพียง แต่ขี้เกียจและวิศวกรรมที่ไม่ดี แต่ยังตอกย้ำการใช้งานโดยผู้ที่ไม่ควรใช้พวกเขาเลย

เป็นที่น่าสังเกตว่า Pike ยอมรับว่าพวกเขามีสถานที่และ IMHO การแสดงออกปกติเป็นเครื่องมือที่ทรงพลังมาก ๆ ซึ่งเป็นรางวัลที่คุ้มค่าอย่างยิ่งเมื่อฉันใช้เวลาเรียนรู้ที่จะใช้และจากมุมมองนั้นฉันขอแนะนำการเรียนรู้อย่างแน่นอน พวกเขา แต่เป็นไปได้ว่าปัญหาที่แท้จริงคือพวกเขาช่วยเหลือด้วยคลื่นความถี่ซึ่งทำให้ฉันได้รับความรู้น้อยลงเกี่ยวกับ lexing และการแยกวิเคราะห์มากกว่าที่ควร :)


0

ให้ฉันบอกว่านิพจน์ปกติมักเป็นเครื่องมือที่เหมาะสมสำหรับงานและค่อนข้างมีประโยชน์โดยเฉพาะอย่างยิ่งกับแอปพลิเคชันที่ใช้การประมวลผลข้อความจำนวนมาก อย่างไรก็ตามการจำพวกเขานั้นเป็นบ้า ฉันมีแผ่นโกงติดบนผนังของฉันที่มีตัวละครพิเศษ, แองเคอร์, คลาสตัวอักษร, โมดิฟายเออร์รูปแบบ, เมตาเฟอเรเตอร์ ... ใช้เวลาเพียง 20 นาทีในการเรียนรู้วิธีใช้และรับชีทเพื่อเก็บ ติดตามทุกอย่างอื่น สิ่งที่คุณต้องการคือให้สามารถเขียนนิพจน์ปกติเมื่อคุณต้องการซึ่งมักจะเกี่ยวกับทุก 6 เดือน - เกี่ยวกับบ่อยเท่าที่คุณเจอปัญหาที่พวกเขาเป็นเครื่องมือที่ดีที่สุดที่จะใช้สำหรับงาน ยกเว้นว่าคุณอยู่ใน Perl, Latex, Emacs หรือทีมประมวลผลข้อความหนักอื่น ๆ

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