Expressões regulares (Expressão Regular) fornecem um método eficiente e conveniente para correspondência de padrões de string. Quase todas as linguagens de alto nível fornecem suporte para expressões regulares ou fornecem bibliotecas de códigos prontas para chamadas. Este artigo utiliza tarefas comuns de processamento no ambiente ASP como exemplo para apresentar as habilidades de aplicação de expressões regulares.
1. Verifique o formato de senhas e endereços de e-mail
Nosso primeiro exemplo demonstra uma função básica de expressões regulares: descrever abstratamente strings arbitrariamente complexas. O que isso significa é que as expressões regulares fornecem aos programadores um método formal de descrição de string que pode descrever qualquer padrão de string encontrado pelo aplicativo com apenas uma pequena quantidade de código. Por exemplo, para pessoas que não estão envolvidas em trabalhos técnicos, os requisitos para o formato da senha podem ser descritos da seguinte forma: o primeiro caractere da senha deve ser uma letra, a senha deve ter no mínimo 4 caracteres e no máximo 15 caracteres, a senha não pode conter além de letras, números e caracteres além de sublinhado.
Como programadores, devemos converter a descrição do formato de senha em linguagem natural acima em outros formatos para que a página ASP possa entendê-la e aplicá-la para evitar a entrada ilegal de senha. A expressão regular que descreve este formato de senha é: ^[a-zA-Z]w{3,14}$.
Em aplicações ASP, podemos escrever o processo de verificação de senha como uma função reutilizável, conforme mostrado abaixo:
Função TestPassword(strPassword)
Escurecer
Definir re = novo RegExp
re.IgnoreCase = false
re.global = falso
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
Função End
Abaixo comparamos a expressão regular para verificação do formato da senha com a descrição em linguagem natural:
o primeiro caractere da senha deve ser uma letra: a descrição da expressão regular é "^[a-zA-Z]", onde " ^" indica o início da string e o hífen informa ao RegExp para corresponder a todos os caracteres no intervalo especificado.
A senha deve ter no mínimo 4 caracteres e no máximo 15 caracteres: a descrição da expressão regular é "{3,14}".
A senha não pode conter caracteres além de letras, números e sublinhados: a descrição da expressão regular é "w".
Algumas notas: {3, 14} significa que o padrão anterior corresponde a pelo menos 3, mas não mais que 14 caracteres (mais o primeiro caractere, passa a ter de 4 a 15 caracteres). Observe que a sintaxe entre chaves é extremamente rígida e não permite espaços em nenhum dos lados da vírgula. Se forem adicionados espaços, isso afetará o significado da expressão regular e causará erros durante a verificação do formato da senha. Além disso, o caractere “$” não é adicionado no final da expressão regular acima. O caractere $ faz com que a expressão regular corresponda à string até o final, garantindo uma senha válida sem quaisquer caracteres adicionais após ela.
Semelhante à verificação do formato da senha, a verificação da legitimidade dos endereços de e-mail também é um problema muito comum. O uso de expressões regulares para realizar a verificação simples do endereço de e-mail pode ser implementado da seguinte forma:
<%.
Escurecer
Definir re = novo RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Response.Write re.Test(" [email protected] ")
%>
2. Extrair partes específicas da página HTML
O principal problema enfrentado na extração de conteúdo da página HTML é que precisamos encontrar uma maneira de identificar com precisão a parte do conteúdo que desejamos. Por exemplo, a seguir está um trecho de código HTML que exibe manchetes de notícias:
<table border="0" width="11%" class="Somestory">
<tr>
<largura td="100%">
<p align="center">Outro conteúdo...</td>
</tr>
</tabela>
<table border="0" width="11%" class="Headline">
<tr>
<largura td="100%">
<p align="center">Guerra no Iraque! </td>
</tr>
</tabela>
<table border="0" width="11%" class="Someotherstory">
<tr>
<largura td="100%">
<p align="center">Outro conteúdo...</td>
</tr>
</table>
Observando o código acima, é fácil perceber que o título da notícia é exibido na tabela do meio e seu atributo de classe está definido como Headline. Se a página HTML for muito complexa, você poderá usar um recurso adicional fornecido pelo Microsoft IE a partir da versão 5.0 para visualizar apenas o código HTML da parte selecionada da página. Visite http://www.microsoft.com/Windows/ie. /WebAccess/default.ASP Saiba mais. Para este exemplo, assumimos que esta é a única tabela cujo atributo de classe está definido como Headline. Agora precisamos criar uma expressão regular, encontrar esta tabela Headline através da expressão regular e incluir esta tabela em nossa própria página. A primeira é escrever código que suporte expressões regulares:
<%
Dim re, strHTML
Set re = new RegExp ' Cria um objeto de expressão regular
re.IgnoreCase = true
re.Global = false 'Finalizar pesquisa após a primeira correspondência
%>
Agora considere a área que queremos extrair: aqui, o que queremos extrair é toda a estrutura <table>, incluindo a tag de fechamento e o texto do título da notícia. Portanto, o caractere inicial da pesquisa deve ser a tag inicial <table>: re.Pattern = "<table.*(?=Headline)". Esta expressão regular corresponde à tag inicial da tabela e pode retornar tudo entre a tag inicial e "Título" (exceto novas linhas). Veja como retornar o código HTML correspondente:
'Coloque todos os códigos HTML correspondentes na coleção Matches
Set Matches = re.Execute(strHTML)
'Exibe todos os códigos HTML correspondentes
Para cada item nas partidas
Resposta.Escrever Item.Valor
Próximo
'Mostrar um dos
Response.write Matches.Item(0).Value
executa este código para processar o fragmento HTML mostrado anteriormente A expressão regular retorna o conteúdo de uma correspondência da seguinte forma: <table border="0" width="11%" class=". . Expressão regular O "(?=Headline)" na expressão não obtém os caracteres, portanto o valor do atributo da classe da tabela não pode ser visto. O código para obter o restante da tabela também é bastante simples: re.Pattern =. "<table.*(?=Headline) (.|n)*?</table>". Entre eles: "*" após "(.|n)" corresponde a 0 a mais caracteres e "? ” minimiza o intervalo de correspondência “*”, ou seja, corresponde ao menor número de caracteres possível antes de encontrar a próxima parte da expressão </table> é a tag final da tabela.
O limitador “?” a expressão de retorno de código para outras tabelas Por exemplo, para o trecho de código HTML fornecido acima, se você excluir este "?", o conteúdo retornado será:
<table border="0" width="11%" class=". Título">
<tr>
<largura td="100%">
<p align="center">Guerra no Iraque! </td>
</tr>
</tabela>
<table border="0" width="11%" class="Someotherstory">
<tr>
<largura td="100%">
<p align="center">Outro conteúdo...</td>
</tr>
</tabela>
O conteúdo retornado não contém apenas a tag <table> da tabela Headline, mas também a tabela Someotherstory. Pode-se observar que o "?"
Este exemplo assume algumas premissas bastante idealistas. Em aplicações reais, a situação costuma ser muito mais complicada, especialmente quando você não tem influência na escrita do código HTML fonte usado, escrever código ASP é particularmente difícil. O método mais eficaz é gastar mais tempo analisando o HTML próximo ao conteúdo a ser extraído e testar frequentemente para garantir que o conteúdo extraído é exatamente o que você precisa. Além disso, você deve prestar atenção e lidar com a situação em que a expressão regular não pode corresponder a nenhum conteúdo da página HTML de origem. O conteúdo pode mudar muito rapidamente, então não acabe com erros ridículos em sua página só porque outra pessoa alterou o formato do conteúdo.
3. Analisar arquivos de dados de texto
Existem muitos formatos e tipos de arquivos de dados. Texto estruturado e até mesmo texto não estruturado muitas vezes se tornam fontes de dados para aplicativos ASP. Um exemplo que veremos a seguir é um arquivo de texto estruturado usando qualificadores. Qualificadores (como aspas) indicam que as partes da sequência são inseparáveis, mesmo que a sequência contenha delimitadores que separam o registro em campos.
A seguir está um arquivo de texto estruturado simples:
sobrenome, nome, número de telefone, descrição Sun, Wukong, 312 555 5656, ASP é muito bom, Pig, Bajie, 847 555 5656, sou produtor de cinema
Este arquivo é muito
.simples. A primeira linha é o título e as duas linhas seguintes são os registros separados por vírgulas. A análise deste arquivo também é muito simples, basta dividir o arquivo em linhas (de acordo com os símbolos de nova linha) e depois dividir cada registro de acordo com os campos. Porém, se adicionarmos vírgulas ao conteúdo de um determinado campo:
sobrenome, nome, número de telefone, descrição Sun, Wukong, 312 555 5656, gosto de ASP, VB e SQL
Pig, Bajie, 847 555 5656, sou produtor de filmes.
Haverá um problema ao analisar o primeiro registro, pois na visão de um analisador que reconhece apenas delimitadores de vírgula, seu último campo contém o conteúdo de dois campos. Para evitar esse tipo de problema, os campos que contêm delimitadores devem ser cercados por qualificadores. Aspas simples são um qualificador comumente usado. Depois de adicionar o qualificador de aspas simples ao arquivo de texto acima, seu conteúdo é o seguinte:
sobrenome, nome, número de telefone, descrição Sun, Wukong, 312 555 5656, 'Gosto de ASP, VB e SQL'
Zhu, Bajie, 847 555 5656, 'Eu sou um produtor de cinema'
Agora podemos determinar qual vírgula é o delimitador e qual vírgula é o conteúdo do campo, ou seja, só precisamos considerar as vírgulas que aparecem entre aspas como o conteúdo do campo. A próxima coisa que precisamos fazer é implementar um analisador de expressões regulares que determine quando dividir os campos com base em vírgulas e quando tratar as vírgulas como conteúdo do campo.
O problema aqui é um pouco diferente daquele enfrentado pela maioria das expressões regulares. Normalmente olhamos uma pequena parte do texto para ver se corresponde a uma expressão regular. Mas aqui, só podemos dizer com segurança o que está entre aspas depois de considerar toda a linha do texto.
Aqui está um exemplo que ilustra o problema. Extraia aleatoriamente meia linha de conteúdo de um arquivo de texto e obtenha: 1, beach, black, 21, ', dog, cat, duck, ', . Neste exemplo, por existirem outros dados à esquerda de “1”, é extremamente difícil analisar seu conteúdo. Não sabemos quantas aspas simples precedem esse fragmento de dados, portanto não podemos determinar quais caracteres estão entre aspas (o texto entre aspas não pode ser dividido durante a análise). Se o fragmento de dados for precedido por um número par (ou nenhuma) aspas simples, então "', dog, cat, duck, '" será uma string entre aspas e será indivisível. Se o número de aspas anteriores for um número ímpar, então "1, beach, black, 21, '" é o fim de uma string e é indivisível.
Portanto, a expressão regular deve analisar toda a linha do texto, levando em consideração quantas aspas aparecem para determinar se o caractere está dentro ou fora do par de aspas, ou seja:,(?=([^']*'[ ^']*') *(?![^']*')). Esta expressão regular primeiro encontra uma aspa, depois continua a pesquisar e garante que o número de aspas simples após a vírgula seja um número par ou zero. Esta expressão regular é baseada no seguinte julgamento: se o número de aspas simples após a vírgula for par, então a vírgula está fora da string. A tabela a seguir fornece instruções mais detalhadas:
, procurando uma vírgula
(?= continua pesquisando para corresponder a este padrão:
(Comece um novo padrão
[^']*' [caracteres sem aspas] 0 ou mais, seguido por uma aspa
[^']*'[^']*) [caracteres sem aspas] 0 ou mais, seguido por uma aspa. Combinado com o conteúdo anterior, corresponde aos pares de cotações
)* termina o padrão e corresponde ao padrão inteiro (pares de aspas) 0 ou mais vezes
(?! Pesquise adiante, exclua este padrão
[^']*' [caracteres sem aspas] 0 ou mais, seguido por uma aspa
) Abaixo do modo final
está uma função VBScript, que aceita um parâmetro de string, divide a string de acordo com o separador de vírgula e o qualificador de aspas simples na string e retorna a matriz de resultados:
Function SplitAdv(strInput)
Dim objRE
Definir objRE = new RegExp
'Definir objeto RegExp
objRE.IgnoreCase = verdadeiro
objRE.Global = verdadeiro
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' O método Replace usa chr(8) para substituir o que queremos para usar vírgula, chr(8) éb
'caractere, b pode aparecer extremamente raramente em uma string.
'Então dividimos a string de acordo com b e a salvamos no array
SplitAdv = Dividir(objRE.Replace(strInput, "b"), "b")
Função final
Resumindo, o uso de expressões regulares para analisar arquivos de dados de texto tem as vantagens de alta eficiência e redução do tempo de desenvolvimento. Ele pode economizar muito tempo na análise de arquivos e na extração de dados úteis com base em condições complexas. Num ambiente em rápida evolução, onde ainda haverá muitos dados tradicionais disponíveis, saber como construir rotinas eficientes de análise de dados será uma habilidade valiosa.
4. Substituição de strings
No último exemplo, veremos a função de substituição de expressões regulares VBScript. ASP é frequentemente usado para formatar dinamicamente texto obtido de várias fontes de dados. Utilizando o poder das expressões regulares VBScript, o ASP pode alterar dinamicamente textos complexos correspondentes. Destacar algumas palavras adicionando tags HTML é uma aplicação comum, como destacar palavras-chave de pesquisa nos resultados de pesquisa.
Para ilustrar como isso é feito, vejamos um exemplo que destaca todos os “.NET” em uma string. Essa sequência pode ser obtida em qualquer lugar, como um banco de dados ou outro site.
<%
Definir regEx = Novo RegExp
regEx.Global = verdadeiro
regEx.IgnoreCase = True
'padrão de expressão regular,
'Procure qualquer palavra ou URL que termine com ".NET".
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' String usada para testar a função de substituição
strText = "A Microsoft criou um novo site www.ASP.NET ."
'Chame o método Replace da expressão regular.'
'$1 significa inserir o texto correspondente na posição atual
Response.Write regEx.Replace(strText, _
"<b style='cor: #000099; tamanho da fonte: 18pt'>$1</b>")
%>
Existem vários pontos importantes que devem ser observados neste exemplo. Toda a expressão regular é colocada entre parênteses e sua função é interceptar todo o conteúdo correspondente para uso posterior, que é referenciado por $1 no texto de substituição. Até 9 interceptações semelhantes podem ser usadas por substituição, referenciadas por $1 a $9 respectivamente. O método Substituir de expressões regulares é diferente da função Substituir do próprio VBScript. Requer apenas dois parâmetros: o texto a ser pesquisado e o texto a ser substituído.
Neste exemplo, para destacar as strings ".NET" pesquisadas, nós as cercamos com tags em negrito e outros atributos de estilo. Usando essa tecnologia de pesquisa e substituição, podemos facilmente adicionar a função de destacar palavras-chave de pesquisa ao programa de pesquisa de sites ou adicionar automaticamente links para outras páginas para palavras-chave que aparecem na página.
Conclusão
Espero que as diversas técnicas de expressões regulares apresentadas neste artigo tenham inspirado você quando e como aplicar expressões regulares. Embora os exemplos neste artigo sejam escritos em VBScript, as expressões regulares também são úteis no ASP.NET. É um dos principais mecanismos para validação de formulário de controle do lado do servidor e é exportado para todo o namespace .Text.RegularExpressions por meio do Sistema. Espaço para nome .Text.RegularExpressions.NET.