Tcl - นิพจน์ทั่วไป
คำสั่ง "regexp" ใช้เพื่อจับคู่นิพจน์ทั่วไปใน Tcl นิพจน์ทั่วไปคือลำดับของอักขระที่มีรูปแบบการค้นหา ประกอบด้วยกฎหลายข้อและตารางต่อไปนี้จะอธิบายกฎเหล่านี้และการใช้งานที่เกี่ยวข้อง
ซีเนียร์ | กฎและคำอธิบาย |
---|---|
1 | x คู่ที่เหมาะสม. |
2 | [a-z] อักษรตัวพิมพ์เล็กจาก az |
3 | . อักขระใด ๆ |
4 | ^ สตริงเริ่มต้นควรตรงกัน |
5 | $ สตริงสิ้นสุดควรตรงกัน |
6 | \^ ลำดับฟันเฟืองเพื่อจับคู่อักขระพิเศษ ^ ในทำนองเดียวกันคุณสามารถใช้กับอักขระอื่น ๆ ได้ |
7 | () เพิ่มลำดับข้างต้นในวงเล็บเพื่อสร้างนิพจน์ทั่วไป |
8 | x* ควรตรงกับ 0 ครั้งหรือมากกว่าที่เกิดขึ้นของ x ก่อนหน้า |
9 | x+ ควรตรงกับ 1 เหตุการณ์หรือมากกว่าที่เกิดขึ้นของ x ก่อนหน้า |
10 | [a-z]? ควรตรงกับ 0 หรือ 1 ครั้งของ x ที่อยู่ข้างหน้า |
11 | {digit} จับคู่ตัวเลขที่เกิดขึ้นของนิพจน์ regex ก่อนหน้าทุกประการ ตัวเลขที่ประกอบด้วย 0-9 |
12 | {digit,} จับคู่ตัวเลข 3 ตัวขึ้นไปของนิพจน์ regex ก่อนหน้า ตัวเลขที่ประกอบด้วย 0-9 |
13 | {digit1,digit2} เหตุการณ์ที่เกิดขึ้นตรงกับช่วงระหว่างการเกิด digit1 และ digit2 ของนิพจน์ regex ก่อนหน้า |
ไวยากรณ์
ไวยากรณ์สำหรับ regex ได้รับด้านล่าง -
regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn
นี่คือคำสั่ง regex เราจะดูเกี่ยวกับสวิตช์เสริมในภายหลัง รูปแบบเป็นกฎตามที่กล่าวไว้ก่อนหน้านี้ สตริงการค้นหาคือสตริงจริงที่ดำเนินการ regex การจับคู่แบบเต็มคือตัวแปรใด ๆ ที่จะเก็บผลลัพธ์ของผลลัพธ์ regex ที่ตรงกัน Submatch1 ถึง SubMatchn เป็นตัวแปร subMatch ทางเลือกที่เก็บผลลัพธ์ของรูปแบบการจับคู่ย่อย
ลองดูตัวอย่างง่ายๆก่อนที่จะดำดิ่งสู่สิ่งที่ซับซ้อน ตัวอย่างง่ายๆสำหรับสตริงที่มีตัวอักษรใด ๆ เมื่อพบอักขระอื่น ๆ ใน regex การค้นหาจะหยุดและส่งคืน
#!/usr/bin/tclsh
regexp {([A-Za-z]*)} "Tcl Tutorial" a b
puts "Full Match: $a"
puts "Sub Match1: $b"
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Full Match: Tcl
Sub Match1: Tcl
หลายรูปแบบ
ตัวอย่างต่อไปนี้แสดงวิธีค้นหารูปแบบต่างๆ นี่คือรูปแบบตัวอย่างสำหรับตัวอักษรที่ตามด้วยอักขระใด ๆ ตามด้วยตัวอักษรใด ๆ
#!/usr/bin/tclsh
regexp {([A-Za-z]*).([A-Za-z]*)} "Tcl Tutorial" a b c
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Full Match: Tcl Tutorial
Sub Match1: Tcl
Sub Match2: Tutorial
โค้ดข้างต้นที่แก้ไขแล้วเพื่อแสดงว่ารูปแบบย่อยสามารถมีได้หลายรูปแบบดังแสดงด้านล่าง -
#!/usr/bin/tclsh
regexp {([A-Za-z]*.([A-Za-z]*))} "Tcl Tutorial" a b c
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial
สวิตช์สำหรับคำสั่ง Regex
รายการสวิตช์ที่มีอยู่ใน Tcl ได้แก่
nocase - ใช้เพื่อละเว้นกรณี
indices - จัดเก็บตำแหน่งของรูปแบบย่อยที่ตรงกันแทนที่จะเป็นอักขระที่ตรงกัน
line- การจับคู่บรรทัดใหม่ที่ละเอียดอ่อน ละเว้นอักขระหลังขึ้นบรรทัดใหม่
start index - ตั้งค่าชดเชยการเริ่มต้นของรูปแบบการค้นหา
ทำเครื่องหมายจุดสิ้นสุดของสวิตช์
ในตัวอย่างข้างต้นฉันจงใจใช้ [AZ, az] สำหรับตัวอักษรทั้งหมดคุณสามารถใช้ -nocase แทนดังที่แสดงด้านล่าง -
#!/usr/bin/tclsh
regexp -nocase {([A-Z]*.([A-Z]*))} "Tcl Tutorial" a b c
puts "Full Match: $a"
puts "Sub Match1: $b"
puts "Sub Match2: $c"
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial
อีกตัวอย่างการใช้สวิตช์แสดงไว้ด้านล่าง -
#!/usr/bin/tclsh
regexp -nocase -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b
puts "Full Match: $a"
puts "Sub Match1: $b"
regexp -nocase -start 4 -line -- {([A-Z]*.([A-Z]*))} "Tcl \nTutorial" a b
puts "Full Match: $a"
puts "Sub Match1: $b"
เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
Full Match: Tcl
Sub Match1: Tcl
Full Match: Tutorial
Sub Match1: Tutorial