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