คำถามติดแท็ก regular-expressions

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

17
“ ตอนนี้คุณมีปัญหาสองประการ” หมายความว่าอย่างไร
มีคำพูดยอดนิยมโดยJamie Zawinski : บางคนเมื่อเผชิญกับปัญหาคิดว่า "ฉันรู้ฉันจะใช้สำนวนปกติ" ตอนนี้พวกเขามีสองปัญหา ควรเข้าใจคำพูดนี้อย่างไร

10
มีเหตุผลที่เฉพาะเจาะจงหรือไม่ในการอ่านการออกแบบไวยากรณ์นิพจน์ปกติหรือไม่?
โปรแกรมเมอร์ทุกคนดูเหมือนจะยอมรับว่าการอ่านโค้ดมีความสำคัญมากกว่าการใช้ซินเทอร์แบบสั้นซึ่งทำงานอยู่ แต่ต้องการผู้พัฒนาระดับสูงในการตีความด้วยความถูกต้องในระดับใด ๆ มีเหตุผลสำหรับสิ่งนี้หรือไม่? เราทุกคนยอมรับว่าดีกว่าselfDocumentingMethodName() e()เหตุใดจึงไม่ควรใช้กับนิพจน์ทั่วไปด้วย ดูเหมือนว่าแทนที่จะออกแบบไวยากรณ์ของตรรกะหนึ่งบรรทัดโดยไม่มีโครงสร้างองค์กร: var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; และนี่ไม่ใช่การแยก URL อย่างเข้มงวดแม้แต่! แต่เราสามารถสร้างโครงสร้างไปป์ไลน์ที่จัดระเบียบและสามารถอ่านได้ตัวอย่างเช่น: string.regex .isRange('A-Z' || 'a-z') .followedBy('/r'); ไวยากรณ์ใดที่มีประโยชน์มากน้อยเพียงใดสำหรับนิพจน์ทั่วไปที่เสนอนอกเหนือจากการดำเนินการที่สั้นที่สุดและไวยากรณ์เชิงตรรกะ ในท้ายที่สุดมีเหตุผลทางเทคนิคเฉพาะสำหรับการอ่านการออกแบบไวยากรณ์นิพจน์ที่ไม่ดีหรือไม่?

25
ควรใช้การตรวจสอบความถูกต้องของที่อยู่อีเมลไกลแค่ไหน
ฉันสงสัยว่าผู้คนควรตรวจสอบที่อยู่อีเมลได้ไกลแค่ไหน ฟิลด์ของฉันคือการพัฒนาเว็บเป็นหลัก แต่สิ่งนี้ใช้ได้กับทุกที่ ฉันเห็นบางแนวทางแล้ว: เพียงตรวจสอบว่ามี "@" อยู่ซึ่งตายง่าย แต่แน่นอนว่าไม่น่าเชื่อถือ การทดสอบ regex ที่ซับซ้อนมากขึ้นสำหรับรูปแบบอีเมลมาตรฐาน regex เต็มรูปแบบกับRFC 2822 - มีปัญหากับเรื่องนี้ก็คือมักจะเป็นอีเมลอาจจะถูกต้อง แต่มันอาจจะไม่ได้เป็นสิ่งที่ผู้ใช้มีความหมาย การตรวจสอบ DNS การตรวจสอบ SMTP ตามที่หลายคนอาจรู้ (แต่หลายคนไม่เข้าใจ) ที่อยู่อีเมลอาจมีการเปลี่ยนแปลงที่แปลกประหลาดมากมายที่คนส่วนใหญ่มักจะไม่พิจารณา (ดูRFC 2822 3.4.1 ) แต่คุณต้องคิดถึงเป้าหมายของ การตรวจสอบของคุณ: คุณเพียงแค่พยายามทำให้แน่ใจว่าข้อความอีเมลสามารถส่งไปยังที่อยู่หรือว่าเป็นสิ่งที่ผู้ใช้อาจจะใส่ (ซึ่งไม่น่าจะเป็นในกรณีที่คลุมเครือมากขึ้น) ที่อยู่ ') ตัวเลือกที่ฉันพิจารณาคือเพียงแค่ให้คำเตือนด้วยที่อยู่ที่ลึกลับ แต่ก็ยังอนุญาตให้ดำเนินการตามคำขอได้ แต่สิ่งนี้จะเพิ่มความซับซ้อนให้กับฟอร์มและผู้ใช้ส่วนใหญ่มีแนวโน้มที่จะสับสน ในขณะที่การตรวจสอบความถูกต้อง DNS / การตรวจสอบ SMTP ดูเหมือนไม่มีปัญหา แต่ฉันพบปัญหาที่เซิร์ฟเวอร์ DNS / เซิร์ฟเวอร์ SMTP หยุดทำงานชั่วคราวและผู้ใช้ไม่สามารถลงทะเบียนที่ไหนสักแห่งหรือเซิร์ฟเวอร์ SMTP …

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

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

11
อ่านนิพจน์ปกติโดยไม่สูญเสียพลังหรือไม่
โปรแกรมเมอร์หลายคนรู้ว่าความสุขของการแสดงออกอย่างรวดเร็วเป็นประจำทุกวันนี้มักมีความช่วยเหลือจากเว็บเซอร์วิสบางอย่างหรือมากกว่านั้นในการโต้ตอบแบบโต้ตอบหรืออาจจะเขียนสคริปต์ขนาดเล็กที่มีนิพจน์ทั่วไปที่กำลังพัฒนาอยู่และชุดกรณีทดสอบ . ไม่ว่าในกรณีใดกระบวนการนี้จะทำซ้ำและค่อนข้างเร็ว: ทำการแฮ็กที่สตริงที่มีลักษณะที่เป็นความลับจนกว่าจะจับคู่และจับภาพสิ่งที่คุณต้องการและจะปฏิเสธสิ่งที่คุณไม่ต้องการ สำหรับผลกรณีง่าย ๆ อาจเป็นแบบนี้ในฐานะ Java regexp: Pattern re = Pattern.compile( "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$" ); โปรแกรมเมอร์หลายคนรู้ถึงความเจ็บปวดที่ต้องแก้ไขนิพจน์ปกติหรือเพียงแค่เขียนโค้ดรอบนิพจน์ปกติในฐานรหัสดั้งเดิม ด้วยการแก้ไขเล็กน้อยเพื่อแยกมันออกไปข้างต้น regexp ยังง่ายต่อการเข้าใจสำหรับทุกคนที่คุ้นเคยกับ regexps และทหารผ่านศึก regexp ควรเห็นทันทีว่ามันทำอะไร (ตอบที่ท้ายโพสต์ในกรณีที่มีคนต้องการออกกำลังกาย ในการหาตัวเอง) อย่างไรก็ตามสิ่งที่ไม่จำเป็นต้องซับซ้อนมากขึ้นสำหรับ regexp ที่จะกลายเป็นสิ่งที่เขียนอย่างเดียวและแม้กระทั่งกับเอกสารขยัน (ซึ่งทุกคนแน่นอนสำหรับ regexps ที่ซับซ้อนทั้งหมดที่พวกเขาเขียน ... ) การปรับเปลี่ยน regexps กลายเป็น งานที่น่ากลัว มันอาจเป็นงานที่อันตรายมากเช่นกันหาก regexp ไม่ได้ทำการทดสอบอย่างระมัดระวัง (แต่ทุกคนแน่นอนมีการทดสอบหน่วยที่ครอบคลุมสำหรับ regexps ที่ซับซ้อนทั้งหมดทั้งในเชิงบวกและเชิงลบ ... ) เรื่องสั้นสั้น ๆมีวิธีแก้ไข / อ่านทางเลือกสำหรับการแสดงออกปกติโดยไม่สูญเสียพลังของพวกเขา? regexp …

5
เมื่อใดที่คุณไม่ควรใช้นิพจน์ปกติ [ปิด]
นิพจน์ทั่วไปเป็นเครื่องมือที่มีประสิทธิภาพในคลังแสงของโปรแกรมเมอร์ แต่มีบางกรณีที่ไม่ใช่ตัวเลือกที่ดีที่สุดหรือแม้แต่เป็นอันตรายทันที ตัวอย่างง่ายๆ # 1 คือการแยกวิเคราะห์ HTML ด้วย regexpซึ่งเป็นถนนที่รู้จักกันดีในข้อบกพร่องมากมาย อาจเป็นเช่นนี้ยังมีคุณสมบัติในการแยกโดยทั่วไป แต่มีพื้นที่อื่นที่ไม่ต้องไปสำหรับการแสดงผลปกติหรือไม่? ป.ล. : " คำถามที่คุณถามปรากฏเป็นเรื่องส่วนตัวและมีแนวโน้มที่จะถูกปิด " - ดังนั้นฉันต้องการเน้นย้ำว่าฉันสนใจตัวอย่างที่ทราบว่าการใช้ regexps ก่อให้เกิดปัญหา

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

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

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

17
เหตุใดนิพจน์ทั่วไปจึงน่าดึงดูดอย่างมาก
ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ส่วนที่ 1 , ส่วนที่2 , ฉันคิดว่าคุณคงไม่สามารถจำตัวอย่างอื่นได้ยาก สิ่งที่: ถ้ามีมากกว่าหนึ่งวิธีในการแก้ปัญหาโปรแกรมเมอร์ PHP (ฉันมักจะเรียกดูแท็ก PHP ใน StackOverflow) จะขอความช่วยเหลือในการแก้ปัญหาที่เกี่ยวข้องกับการแสดงออกปกติ แม้ว่าจะประหยัดน้อยลงแม้ว่าคู่มือ php จะแนะนำ ( ลิงก์ ) ให้ใช้str_replaceแทนฟังก์ชันpreg_*หรือereg_*ฟังก์ชันใด ๆเมื่อไม่จำเป็นต้องใช้กฎการแทนที่แฟนซี มีใครบางคนสงสัยว่าทำไมสิ่งนี้ถึงเกิดขึ้น? อย่าเข้าใจฉันผิดเพื่อนที่ดีที่สุดของฉันบางคนเป็นสำนวนปกติและฉันก็ไม่ได้ดูถูก Perl สิ่งที่ฉันไม่ได้รับคือเหตุผลที่ไม่มีทางเลือกใด ๆ แม้เมื่อ overkill ชัดเจน (regex เพื่อสลับสตริง) หรือความซับซ้อนของรหัสเพิ่มขึ้นอย่างมาก (regex สำหรับรับข้อมูลจาก html ใน PHP )

5
สามารถกำหนดรูปแบบ csv โดย regex ได้หรือไม่?
เพื่อนร่วมงานและฉันเพิ่งจะถกเถียงกันว่า regex บริสุทธิ์นั้นมีความสามารถในการห่อหุ้มรูปแบบ csv อย่างเต็มที่หรือไม่ซึ่งมันสามารถแยกวิเคราะห์ไฟล์ทั้งหมดด้วย escape char ที่ระบุไว้, ถ่าน char และถ่านคั่น regex ไม่จำเป็นต้องสามารถเปลี่ยน chars เหล่านี้หลังจากการสร้าง แต่จะต้องไม่ล้มเหลวในกรณี edge อื่น ๆ ฉันได้แย้งว่านี่เป็นไปไม่ได้สำหรับแค่ tokenizer regex เดียวที่อาจทำสิ่งนี้เป็นรูปแบบ PCRE ที่ซับซ้อนมากซึ่งเคลื่อนไปไกลกว่าเพียงแค่โทเค็น ฉันกำลังมองหาบางอย่างตามแนวของ: ... รูปแบบ csv เป็นบริบทไวยากรณ์ฟรีและเป็นไปไม่ได้ที่จะแยกวิเคราะห์ด้วย regex เพียงอย่างเดียว ... หรือฉันผิด เป็นไปได้หรือไม่ที่จะแยก csv ด้วย POSIX regex? ตัวอย่างเช่นถ้าทั้ง char char และ quote char อยู่"ดังนั้นทั้งสองบรรทัดนี้จะเป็น csv ที่ถูกต้อง: """this is …

7
ฉันควร refactor ฟังก์ชั่นขนาดใหญ่ที่ส่วนใหญ่ประกอบด้วย regex หนึ่งหรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันเพิ่งเขียนฟังก์ชันที่ครอบคลุมประมาณ 100 บรรทัด ได้ยินว่าคุณอาจถูกล่อลวงให้บอกฉันเกี่ยวกับความรับผิดชอบเดี่ยวและกระตุ้นให้ฉันไปปรับโครงสร้าง นี่คือสัญชาตญาณของฉันเช่นกัน แต่นี่คือปัญหา: ฟังก์ชันทำสิ่งหนึ่ง มันดำเนินการจัดการสตริงที่ซับซ้อนและร่างกายฟังก์ชั่นประกอบด้วยส่วนใหญ่ของหนึ่ง verbose regex แยกออกเป็นหลายบรรทัดที่มีเอกสาร ถ้าฉันแยก regex ออกเป็นหลาย ๆ ฟังก์ชั่นฉันรู้สึกว่าฉันจะสูญเสียความสามารถในการอ่านได้เนื่องจากฉันเปลี่ยนภาษาได้อย่างมีประสิทธิภาพและจะไม่สามารถใช้ประโยชน์จากคุณสมบัติบางอย่างของ regex นี่คือคำถามของฉัน: เมื่อพูดถึงการจัดการสตริงที่มีการแสดงออกปกติร่างกายของฟังก์ชั่นขนาดใหญ่ยังคงมีรูปแบบการต่อต้านหรือไม่? ดูเหมือนว่ากลุ่มการดักจับที่ตั้งชื่อไว้นั้นมีจุดประสงค์คล้ายกันมากกับฟังก์ชั่น โดยวิธีการที่ฉันมีการทดสอบสำหรับทุกการไหลผ่าน Regex

6
สิ่งที่สามารถ / ควรทำด้วยการแสดงออกปกติ? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันเพิ่งเรียนรู้การแสดงออกปกติและฉันรักการเขียน / ใช้พวกเขา ฉันกำลังมองหาความคิดและโอกาสในการใช้งานมากขึ้น แต่ฉันไม่ต้องการใช้มากเกินไปเป็นเครื่องมืออเนกประสงค์ตามที่ผู้คนมักเตือน ฉันควรใช้สิ่งใดในการแสดงออกปกติและฉันไม่ควรใช้สิ่งใด (นอกเหนือจากที่ชัดเจน: การแยกวิเคราะห์ HTML)

1
รูปแบบ Java regex - ค่าคงที่เวลารวบรวมหรือสมาชิกอินสแตนซ์?
ขณะนี้ฉันมีวัตถุซิงเกิลสองสามตัวที่ฉันจับคู่กับนิพจน์ทั่วไปและคำPatternนิยามของฉันเป็นดังนี้: class Foobar { private final Pattern firstPattern = Pattern.compile("some regex"); private final Pattern secondPattern = Pattern.compile("some other regex"); // more Patterns, etc. private Foobar() {} public static Foobar create() { /* singleton stuff */ } } แต่ผมก็บอกคนในวันอื่น ๆ ที่ว่านี้เป็นรูปแบบที่ไม่ดีและPatternควรเสมอจะกำหนดไว้ในระดับชั้นเรียนและสิ่งที่มีลักษณะเช่นนี้แทน: class Foobar { private static final Pattern FIRST_PATTERN = Pattern.compile("some …

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