Tcl - Expressões regulares

O comando "regexp" é usado para corresponder a uma expressão regular em Tcl. Uma expressão regular é uma sequência de caracteres que contém um padrão de pesquisa. Ele consiste em várias regras e a tabela a seguir explica essas regras e o uso correspondente.

Sr. Não. Regra e descrição
1

x

Combinação exata.

2

[a-z]

Qualquer letra minúscula de az.

3

.

Qualquer personagem.

4

^

A string inicial deve corresponder.

5

$

A string final deve corresponder.

6

\^

Seqüência de folga para corresponder ao caractere especial ^. Da mesma forma, você pode usar para outros caracteres.

7

()

Adicione as sequências acima entre parênteses para fazer uma expressão regular.

8

x*

Deve corresponder a 0 ou mais ocorrências do x anterior.

9

x+

Deve corresponder a 1 ou mais ocorrências do x anterior.

10

[a-z]?

Deve corresponder a 0 ou 1 ocorrência do x anterior.

11

{digit}

Corresponde exatamente a ocorrências de dígitos da expressão regex anterior. Dígito que contém 0-9.

12

{digit,}

Corresponde a 3 ou mais ocorrências de dígitos da expressão regex anterior. Dígito que contém 0-9.

13

{digit1,digit2}

As ocorrências correspondem ao intervalo entre ocorrências de dígito1 e dígito2 da expressão regex anterior.

Sintaxe

A sintaxe para regex é fornecida abaixo -

regexp optionalSwitches patterns searchString fullMatch subMatch1 ... subMatchn

Aqui, regex é o comando. Veremos sobre opções opcionais mais tarde. Os padrões são as regras mencionadas anteriormente. A string de pesquisa é a string real na qual o regex é executado. A correspondência total é qualquer variável para conter o resultado do resultado regex correspondente. Submatch1 a SubMatchn são variáveis ​​opcionais de subMatch que contêm o resultado dos padrões de subcasas.

Vejamos alguns exemplos simples antes de mergulhar nos complexos. Um exemplo simples para uma string com qualquer alfabeto. Quando qualquer outro caractere for encontrado na regex, a pesquisa será interrompida e retornada.

#!/usr/bin/tclsh

regexp {([A-Za-z]*)} "Tcl Tutorial" a b 
puts "Full Match: $a"
puts "Sub Match1: $b"

Quando o código acima é executado, ele produz o seguinte resultado -

Full Match: Tcl
Sub Match1: Tcl

Padrões Múltiplos

O exemplo a seguir mostra como pesquisar vários padrões. Este é um exemplo de padrão para qualquer alfabeto seguido por qualquer caractere seguido por qualquer alfabeto.

#!/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"

Quando o código acima é executado, ele produz o seguinte resultado -

Full Match: Tcl Tutorial
Sub Match1: Tcl
Sub Match2: Tutorial

Uma versão modificada do código acima para mostrar que um subpadrão pode conter vários padrões é mostrada abaixo -

#!/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"

Quando o código acima é executado, ele produz o seguinte resultado -

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

Opções para Comando Regex

A lista de opções disponíveis em Tcl são,

  • nocase - Usado para ignorar o caso.

  • indices - Armazene a localização de subpadrões correspondentes em vez de caracteres correspondentes.

  • line- Nova correspondência de linha sensível. Ignora os caracteres após a nova linha.

  • start index - Define o deslocamento do início do padrão de pesquisa.

  • Marca o fim dos interruptores

Nos exemplos acima, usei deliberadamente [AZ, az] para todos os alfabetos, você pode facilmente usar -nocase em vez de como mostrado abaixo -

#!/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"

Quando o código acima é executado, ele produz o seguinte resultado -

Full Match: Tcl Tutorial
Sub Match1: Tcl Tutorial
Sub Match2: Tutorial

Outro exemplo usando interruptores é mostrado abaixo -

#!/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"

Quando o código acima é executado, ele produz o seguinte resultado -

Full Match: Tcl 
Sub Match1: Tcl 
Full Match: Tutorial
Sub Match1: Tutorial