มีวิธีปฏิบัติทั่วไปในการแสดงความคิดเห็นนิพจน์ทั่วไปหรือไม่: ความคิดเห็นแบบอินไลน์อ้างอิงส่วนต่าง ๆ ของ RegEx หรือความคิดเห็นทั่วไปสำหรับการแสดงออกทั้งหมด?
มีวิธีปฏิบัติทั่วไปในการแสดงความคิดเห็นนิพจน์ทั่วไปหรือไม่: ความคิดเห็นแบบอินไลน์อ้างอิงส่วนต่าง ๆ ของ RegEx หรือความคิดเห็นทั่วไปสำหรับการแสดงออกทั้งหมด?
คำตอบ:
ในทัศนะของฉันแนวทางปฏิบัติที่ดีคือการแสดงความคิดเห็นอย่างชัดเจนว่าแนวคิดทั่วไปของการแสดงออกปกติคืออะไร สิ่งนี้จะช่วยให้นักพัฒนาซอฟต์แวร์รายอื่น ๆ (หรือบางครั้งเป็นตัวคุณเอง) ความยุ่งยากในการคัดลอกวาง regex ในโปรแกรมแยกวิเคราะห์เช่นRegExrเพื่อทำความเข้าใจว่ามันทำอะไร
นี่เป็นคำตอบเฉพาะภาษา แต่ไม่มีภาษาระบุในคำถาม
หนังสือ"Dive Into Python"แนะนำการใช้ความคิดเห็นโดยใช้Verbose Regular Expressions :
Python ช่วยให้คุณทำสิ่งนี้ด้วยสิ่งที่เรียกว่าการแสดงออกปกติ verbose การแสดงออกปกติ verbose แตกต่างจากการแสดงออกปกติขนาดกะทัดรัดในสองวิธี:
- ช่องว่างจะถูกละเว้น ช่องว่างแท็บและการขึ้นบรรทัดใหม่ไม่ตรงกับช่องว่างแท็บและการขึ้นบรรทัดใหม่ พวกเขาไม่ตรงเลย (หากคุณต้องการจับคู่ช่องว่างในนิพจน์ทั่วไปแบบละเอียดคุณจะต้องหลบหนีโดยใส่เครื่องหมายแบ็กสแลชไว้ด้านหน้า)
- ความคิดเห็นจะถูกละเว้น ความคิดเห็นในการแสดงออกปกติ verbose เป็นเหมือนความคิดเห็นในรหัส Python มันเริ่มต้นด้วย
#
ตัวอักษรและไปจนถึงจุดสิ้นสุดของบรรทัด ในกรณีนี้มันเป็นความคิดเห็นภายในสตริงหลายบรรทัดแทนที่จะอยู่ในซอร์สโค้ดของคุณ แต่มันก็ทำงานในลักษณะเดียวกัน
ตัวอย่าง:
>>> pattern = """
^ # beginning of string
M{0,4} # thousands - 0 to 4 M's
(CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
# or 500-800 (D, followed by 0 to 3 C's)
(XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
# or 50-80 (L, followed by 0 to 3 X's)
(IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
# or 5-8 (V, followed by 0 to 3 I's)
$ # end of string
"""
>>> re.search(pattern, 'M', re.VERBOSE) 1
แหล่งที่มาและรายละเอียดเพิ่มเติมที่นี่
วิธีนี้มีข้อเสียเล็กน้อยที่ผู้เรียกต้องรู้ว่ารูปแบบนั้นเขียนในรูปแบบ verbose และเรียกมันตามนั้น
re.compile
ที่จุดที่คุณกำหนดรูปแบบของคุณและเก็บเฉพาะวัตถุที่เป็นผลลัพธ์ ด้วยวิธีนี้แฟล็กการรวบรวมรูปแบบ (รวมถึงre.VERBOSE
) ไม่จำเป็นต้องถูกแยกออกจากรูปแบบเอง
#
ถ้าฉันใช้ธง verbose ได้อย่างไร โดยวิธีการ: ลิงค์แหล่งที่มาดูเหมือนว่าจะลง
#
สามารถจับคู่ได้อย่างแท้จริงเมื่ออยู่ในคลาสอักขระ: [#]
(แหล่งที่มา: docs.python.org/3/library/re.html#re.X )
โดยทั่วไปแล้วฉันจะเขียน regex และไม่อธิบายแต่ละส่วนของ regex แต่มันคือจุดประสงค์อะไร นั่นคือสิ่งที่และทำไม นี่เป็นคำถามที่ถามว่า "ความคิดเห็นของฉันควรเป็นอย่างไร" คนที่จะพูดว่า " อย่าเขียนโค้ดทำอะไรเขียนว่าทำไมโค้ดถึงทำในสิ่งที่มันทำ "
// Strip the leading "?" and remove the query parameters "offset=<integer>" & "count=<integer> so we have a pattern of the request"
var search = location.search.substring(1).replace(/offset=[0-9]+?&/g, "").replace(/count=[0-9]+?&/g, "");
ถ้าคุณไม่พยายามสอนใครบางคนเกี่ยวกับ regexes ผ่านความคิดเห็นในรหัสฉันไม่คิดว่าจะอธิบายสิ่งที่แต่ละชิ้นจะทำ เมื่อทำงานร่วมกับโปรแกรมเมอร์คนอื่น ๆ คุณสามารถสันนิษฐานได้ว่าใคร ๆ จะรู้ว่าอะไรเป็นนิพจน์ทั่วไปทั่วโลก
ฉันเดาว่ามันขึ้นอยู่กับว่าคุณรวม regex เข้าด้วยกันอย่างไร โดยทั่วไปฉันคิดว่าเป็นความคิดที่ดีที่จะใส่ความคิดเห็นไว้ในสตริง regex จริง ๆ (ไม่สามารถทำได้ในสถานการณ์ส่วนใหญ่เท่าที่ฉันรู้) หากคุณต้องการแสดงความคิดเห็นเฉพาะบางส่วนของนิพจน์ทั่วไป (คุณพยายามสอนใครบางคนหรือไม่) จากนั้นแบ่งแต่ละอันออกเป็นสตริงแยกกันในบรรทัดของตนเองและแสดงความคิดเห็นแต่ละบรรทัดโดยใช้กระบวนการแสดงความคิดเห็นปกติสำหรับภาษาโปรแกรมของคุณ มิฉะนั้นคำตอบของ pleinolijf ก็ค่อนข้างดี
ตัวอย่าง:
string myregex = "\s" // Match any whitespace once
+ "\n" // Match one newline character
+ "[a-zA-Z]"; // Match any letter
ฉันมักจะกำหนดค่าคงที่สตริงที่ชื่ออธิบายถึงวัตถุประสงค์โดยรวมของการแสดงออกปกติ
ตัวอย่างเช่น:
const string FloatingPointNumberPattern = @"[-+]?[0-9]*\.?[0-9]+";
คุณสามารถเพิ่มความคิดเห็นข้างบนค่าคงที่นี้เพื่อให้คำอธิบาย แต่โดยปกติชื่อค่าคงที่ควรจะเพียงพอ
ในบางสถานการณ์ผู้พัฒนาอาจใช้นิพจน์ทั่วไปเพื่อจับคู่ข้อความนอกโดเมนทั่วไป นักพัฒนาดั้งเดิมอาจต้องผ่านการทำซ้ำหลายครั้งในการจับเคสขอบต่างๆที่อาจถูกค้นพบผ่านกระบวนการวนซ้ำนั้นเท่านั้น ดังนั้นผู้พัฒนาที่ตามมาอาจไม่ได้ตระหนักถึงกรณีขอบจำนวนมากที่นักพัฒนาดั้งเดิมจัดการกับแม้ว่าพวกเขาจะตระหนักถึงกรณีทั่วไป
ในกรณีเช่นนี้อาจเป็นประโยชน์กับเอกสารตัวอย่างของรูปแบบที่เปลี่ยนแปลง ตำแหน่งของเอกสารนี้อาจแตกต่างกันไปขึ้นอยู่กับจำนวนเงิน (เช่นไม่จำเป็นในรหัส)
วิธีหนึ่งในการเข้าถึงคือสมมติว่าผู้พัฒนาในอนาคตจะมีความรู้พื้นฐานเช่นการแสดงออกปกติ แต่ไม่มีความรู้ใด ๆ ที่คุณ (1) เคยมีมาก่อนการพัฒนานิพจน์ทั่วไปที่ไม่จำเป็นต้องรู้จัก นักพัฒนาในอนาคตหรือ (2) ความรู้ที่คุณได้รับระหว่างการพัฒนา (เช่นกรณีที่มีการค้นพบ)
ตัวอย่างเช่นหากในระหว่างการพัฒนาคุณพูดว่า "โอ้ฉันไม่รู้ว่า X สามารถใช้แบบฟอร์มนี้" ดังนั้นจึงควรบันทึกไว้ว่า (และอาจเป็นส่วนหนึ่งของ regex ที่จัดการรูปแบบนั้น)
ความคิดเห็นควรเพิ่มข้อมูลที่เป็นประโยชน์ที่ไม่ชัดเจนจากรหัส
มีแอปพลิเคชั่นไม่กี่ตัวที่ต้องใช้ทุกรอบสุดท้ายหากคุณจับคู่รูปแบบชุดข้อมูลขนาดใหญ่อาจมีวิธีที่ดีกว่าอาจจะไม่ใช่ แต่สำหรับทุกสิ่งส่วนใหญ่เวลาดำเนินการพิเศษนั้นไม่ใช่เรื่องใหญ่
และจำคนต่อไปที่จะเจอรหัสของคุณและแก้ไขข้อผิดพลาดอาจเป็นคุณในเวลาหกเดือนและไม่มีทางที่คุณจะจำสิ่งที่มันควรจะทำ
แยก RegEx ลงในคลาสที่แยกออกมาเป็น a ด้วยชื่อที่มีความหมาย จากนั้นฉันจะบันทึกรหัสด้วยการทดสอบอัตโนมัติ
สิ่งนี้จะทำให้มั่นใจ
โดยปกติคลาสของคุณอาจโฮสต์หลาย regex