โฮมเพจ » ทำอย่างไร » วิธีใช้นิพจน์ทั่วไปพื้นฐานเพื่อการค้นหาที่ดีขึ้นและประหยัดเวลา

    วิธีใช้นิพจน์ทั่วไปพื้นฐานเพื่อการค้นหาที่ดีขึ้นและประหยัดเวลา

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

    (การ์ตูนจาก XKCD.com)

    นิพจน์ทั่วไปคืออะไร?

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

    เนื่องจากการใช้นิพจน์ทั่วไปอาศัยไวยากรณ์พิเศษโปรแกรมของคุณจะต้องสามารถอ่านและแยกวิเคราะห์ได้ โปรแกรมเปลี่ยนชื่อไฟล์แบทช์หลายรุ่นสำหรับ Windows และ OS X มีการสนับสนุน regexps รวมถึงเครื่องมือค้นหาข้ามแพลตฟอร์ม GREP (ซึ่งเราได้สัมผัสในคู่มือ Bash Scripting for Beginners) และเครื่องมือบรรทัดคำสั่ง Awk สำหรับ * ระวัง นอกจากนี้ตัวจัดการไฟล์ทางเลือกตัวเรียกใช้งานและเครื่องมือค้นหาอื่น ๆ ใช้พวกเขาและพวกเขามีสถานที่สำคัญมากในภาษาการเขียนโปรแกรมเช่น Perl และ Ruby สภาพแวดล้อมการพัฒนาอื่น ๆ เช่น. NET, Java, และ Python รวมถึง C ++ 11 ที่กำลังจะมีให้ทุกไลบรารีมาตรฐานสำหรับการใช้นิพจน์ทั่วไป อย่างที่คุณสามารถจินตนาการได้ว่ามันมีประโยชน์จริง ๆ เมื่อพยายามลดจำนวนรหัสที่คุณใส่ลงในโปรแกรม.

    หมายเหตุเกี่ยวกับการหลีกเลี่ยงอักขระ

    ก่อนที่เราจะแสดงให้คุณเห็นตัวอย่างเราต้องการที่จะชี้ให้เห็นบางอย่าง เรากำลังจะใช้ bash shell และคำสั่ง grep เพื่อแสดงวิธีใช้นิพจน์ทั่วไป ปัญหาคือบางครั้งเราต้องการใช้อักขระพิเศษที่ต้องส่งผ่านไปยัง grep และ bash shell จะตีความอักขระนั้นเพราะเชลล์ใช้เช่นกัน ในสถานการณ์เหล่านี้เราต้อง "หลบหนี" ตัวละครเหล่านี้ สิ่งนี้อาจทำให้สับสนเนื่องจาก“ การหลบหนี” ของตัวละครก็เกิดขึ้นภายใน regexps ตัวอย่างเช่นหากเราต้องการใส่สิ่งนี้ลงใน grep:

    \<

    เราจะต้องแทนที่ด้วย:

    \\\<

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

    '\<'

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

    พวกมันจะขยายได้อย่างไร?

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

    ทอม [0123456789]

    เครื่องหมายวงเล็บเหลี่ยม - [และ] - บอกเครื่องมือแยกวิเคราะห์ว่าสิ่งใดก็ตามที่อยู่ภายในอักขระตัวใดตัวหนึ่งอาจถูกใช้เพื่อจับคู่ สิ่งที่อยู่ภายในวงเล็บเหล่านี้เรียกว่าชุดอักขระ.

    ดังนั้นหากเรามีรายการจำนวนมากและเราใช้ regex นี้เพื่อค้นหาคำต่อไปนี้จะถูกจับคู่:

    • ทอม
    • tom0
    • tom1
    • tom2
    • tom3

    และอื่น ๆ อย่างไรก็ตามรายการต่อไปนี้จะไม่ถูกจับคู่และจะไม่ปรากฏในผลลัพธ์ของคุณ:

    • มะเขือเทศ ; regex ไม่ได้มีตัวอักษรใด ๆ หลังจาก "ทอม"
    • ทอม; regex คำนึงถึงขนาดตัวพิมพ์!

    นอกจากนี้คุณยังสามารถเลือกค้นหาด้วยเครื่องหมายจุด (.) ซึ่งจะอนุญาตให้มีตัวละครใด ๆ อยู่ตราบใดที่มีตัวอักษรอยู่.

    อย่างที่คุณเห็น grepping with

    .ทอม

    ไม่ได้นำเงื่อนไขที่มี "ทอม" มาก่อนเท่านั้น แม้แต่ "มะเขือเทศสีเขียว" ก็เข้ามาเพราะพื้นที่ก่อน "ทอม" นับเป็นตัวละคร แต่คำเช่น "tomF" ไม่ได้มีตัวละครในตอนเริ่มต้นและถูกมองข้ามไป.

    หมายเหตุ: พฤติกรรมเริ่มต้นของ Grep คือการส่งข้อความทั้งบรรทัดเมื่อบางส่วนตรงกับ regex ของคุณ โปรแกรมอื่นอาจไม่ทำเช่นนี้และคุณสามารถปิดได้ด้วย grep ด้วยแฟล็ก '-o'.

    คุณยังสามารถระบุการสลับโดยใช้ไพพ์ (|) เช่นที่นี่:

    speciali (s | z) อี

    จะพบทั้ง:

    • มีความเชี่ยวชาญ
    • มีความเชี่ยวชาญ

    เมื่อใช้คำสั่ง grep เราจำเป็นต้องหลีกเลี่ยงอักขระพิเศษ (, | และ) ด้วยแบ็กสแลชและใช้แฟล็ก '-E' เพื่อให้สิ่งนี้ทำงานและหลีกเลี่ยงข้อผิดพลาดที่น่าเกลียด.

    ดังที่เราได้กล่าวถึงข้างต้นนี้เป็นเพราะเราจำเป็นต้องบอกให้ bash shell ส่งตัวอักษรเหล่านี้ไปยัง grep และไม่ต้องทำอะไรกับมัน แฟล็ก '-E' บอกให้ grep ใช้วงเล็บและไพพ์เป็นอักขระพิเศษ.

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

    ทอม [^ F | 0-9]

    อีกครั้งหากคุณใช้ grep และ bash อย่าลืมที่จะหลบหนีไปป์นั้น!

    คำศัพท์ที่อยู่ในรายการ แต่ไม่ปรากฏคือ:

    • tom0
    • tom5
    • tom9
    • tomF

    สิ่งเหล่านี้ไม่ตรงกับ regex ของเรา.

    ฉันจะใช้ประโยชน์จากสภาพแวดล้อมได้อย่างไร?

    บ่อยครั้งที่เราค้นหาตามขอบเขต บางครั้งเราต้องการเพียงสตริงที่ปรากฏที่จุดเริ่มต้นของคำท้ายคำหรือท้ายบรรทัด สามารถทำได้อย่างง่ายดายโดยใช้สิ่งที่เราเรียกว่าแองเคอร์.

    การใช้เครื่องหมายรูปหมวก (ด้านนอกของวงเล็บ) ช่วยให้คุณสามารถกำหนด "จุดเริ่มต้น" ของบรรทัด.

    ^ ทอม

    หากต้องการค้นหาจุดสิ้นสุดของบรรทัดให้ใช้เครื่องหมายดอลลาร์.

    ทอม $

    คุณจะเห็นว่าสตริงการค้นหาของเรามาก่อนที่จะสมอในกรณีนี้.

    นอกจากนี้คุณยังสามารถจับคู่ที่ปรากฏที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำไม่ใช่ทั้งบรรทัด.

    \

    ทอม \>

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

    ผลลัพธ์เหมือนกัน ตรวจสอบให้แน่ใจว่าคุณใช้เครื่องหมายคำพูดเดี่ยวไม่ใช่เครื่องหมายคำพูดคู่.

    ทรัพยากรอื่น ๆ สำหรับ Regexps ขั้นสูง

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

    • Zytrax.com มีหน้าเว็บไม่กี่หน้าพร้อมตัวอย่างเฉพาะว่าทำไมสิ่งต่าง ๆ จึงไม่ตรงกัน.
    • Regular-Expressions.info ยังมีคู่มือนักฆ่าสำหรับเนื้อหาขั้นสูงมากมายรวมถึงหน้าอ้างอิงที่มีประโยชน์.
    • Gnu.org มีหน้าที่ทุ่มเทให้กับการใช้ regexps กับ grep.

    คุณยังสามารถสร้างและทดสอบการแสดงผลปกติของคุณโดยใช้เครื่องมือออนไลน์ที่ใช้ Flash ฟรีที่เรียกว่า RegExr มันทำงานได้ในขณะที่คุณพิมพ์ฟรีและสามารถใช้ได้ในเบราว์เซอร์ส่วนใหญ่.


    คุณมีการใช้งานที่ชื่นชอบสำหรับการแสดงออกปกติ? รู้การเปลี่ยนชื่อชุดใหญ่ที่ใช้พวกเขา? บางทีคุณอาจต้องการคุยโม้เรื่อง grep-fu ของคุณ มีส่วนร่วมความคิดของคุณโดยการแสดงความคิดเห็น!