Exemplo de expressões regulares: um analisador WikiFlash Player 9 e posterior, Adobe AIR 1.0 e posterior Esse exemplo simples de conversão de texto Wiki ilustra vários usos para expressões regulares:
Para obter os arquivos de aplicativo deste exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br. Os arquivos de aplicativo WikiEditor podem ser encontrados na pasta Samples/WikiEditor. O aplicativo consiste nos seguintes arquivos:
Definição da classe WikiParserA classe WikiParser inclui métodos que convertem texto de entrada Wiki em saída HTML equivalente. Esse não é um aplicativo de conversão Wiki muito robusto, mas ele ilustra alguns bons usos de expressões regulares para correspondência de padrão e conversão de strings. A função de construtor, junto com o método setWikiData(), simplesmente inicializa uma string de amostra do texto de entrada Wiki, como se segue: public function WikiParser() { wikiData = setWikiData(); } Quando o usuário clica no botão Testar no aplicativo de amostra, o aplicativo chama o método parseWikiString() do objeto WikiParser. Esse método chama vários outros métodos, que por sua vez montam a string HTML resultante. public function parseWikiString(wikiString:String):String { var result:String = parseBold(wikiString); result = parseItalic(result); result = linesToParagraphs(result); result = parseBullets(result); return result; } Cada um dos métodos chamados — parseBold(), parseItalic(), linesToParagraphs() e parseBullets()— usa o método replace() da string para substituir os padrões de correspondência, definidos por uma expressão regular, para transformar o texto de entrada Wiki em texto no formato HTML. Conversão de padrões negrito e itálicoO método parseBold() procura padrão de texto negrito Wiki (como '''foo''') e o transforma em seu equivalente em HTML (como <b>foo</b>), como se segue: private function parseBold(input:String):String { var pattern:RegExp = /'''(.*?)'''/g; return input.replace(pattern, "<b>$1</b>"); } Observe que a parte (.?*) de uma pressão regular corresponde a vários caracteres (*) entre os dois padrões de definição'''. O quantificador ? torna a correspondência não greedy, para que uma string como '''aaa''' bbb '''ccc''', a primeira string correspondida será '''aaa''' e não a string inteira (que começa e termina com o padrão '''). Os parênteses na expressão regular definem um grupo de captura, e o método replace() se refere a esse grupo utilizando o código $1 na string de substituição. O sinalizador g (global) na expressão regular garante que o método replace() substitua todas as correspondências na string (não simplesmente a primeira). O método parseItalic() funciona de forma semelhante ao método parseBold(), exceto pelo fato de ele verificar dois apóstrofes ('') como o delimitador para texto itálico (não três): private function parseItalic(input:String):String { var pattern:RegExp = /''(.*?)''/g; return input.replace(pattern, "<i>$1</i>"); } Conversão de padrões de bulletComo mostra o exemplo a seguir, o método parseBullet() procura o padrão de linha de bullet Wiki (como * foo) e o transforma em seu equivalente HTML (como <li>foo</li>): private function parseBullets(input:String):String { var pattern:RegExp = /^\*(.*)/gm; return input.replace(pattern, "<li>$1</li>"); } O símbolo ^ no início de uma expressão regular corresponde ao início de uma linha. O sinalizador m (multiline) na expressão regular faz com que essa expressão corresponda o símbolo ^ ao início de uma linha, e não simplesmente ao início da string. O padrão \* corresponde a um caractere asterisco (a barra invertida é usada para sinalizar um asterisco literal em vez de um quantificador *). Os parênteses na expressão regular definem um grupo de captura, e o método replace() se refere a esse grupo utilizando o código $1 na string de substituição. O sinalizador g (global) na expressão regular garante que o método replace() substitua todas as correspondências na string (não simplesmente a primeira). Conversão de padrões Wiki de parágrafosO método linesToParagraphs() converte cada linha na string Wiki de entrada em uma tag de parágrafo HTML <p>. Essas linhas no método retiram linhas vazias da string Wiki de entrada: var pattern:RegExp = /^$/gm; var result:String = input.replace(pattern, ""); Os símbolos ^ e $ de uma expressão regular correspondem ao início e ao fim de uma linha. O sinalizador m (multiline) na expressão regular faz com que essa expressão corresponda o símbolo ^ ao início de uma linha, e não simplesmente ao início da string. O método replace() substitui todas as substrings correspondentes (linhas vazias) por uma string vazia (""). O sinalizador g (global) na expressão regular garante que o método replace() substitua todas as correspondências na string (não simplesmente a primeira). Conversão de URLs para tags HTML <a>Quando o usuário clica no botão Testar no aplicativo de amostra, se ele marcou a caixa de seleção urlToATag, o aplicativo chama o método estático URLParser.urlToATag() para converter as strings URL da string Wiki de entrada em tags HTML <a>. var protocol:String = "((?:http|ftp)://)"; var urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; var optionalUrlPart:String = "(\.[a-z0-9_-]*)"; var urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); var result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>"); A função do construtor RegExp() é usada para montar uma expressão regular (urlPattern) a partir de inúmeras partes constituintes. Essas partes constituintes são cada string que define parte do padrão da expressão regular. A primeira parte do padrão da expressão regular, definida pela string protocol, define um protocolo de URL: http:// ou ftp://. Os parênteses definem um grupo de não captura, indicado pelo símbolo ?. Isso significa que os parênteses são usados simplesmente para definir um grupo para o padrão de alternação |; o grupo não corresponderá a códigos de referência anterior ($1, $2, $3) na string de substituição do método replace(). As outras partes constituintes da expressão regular usam grupos de captura (indicado por parênteses no padrão), que são usados nos códigos de referência anterior ($1, $2, $3) na string de substituição do método replace(). A parte do padrão definido pela string urlPart corresponde a pelo menos um destes caracteres: a-z, 0-9, _ ou-. O quantificador + indica que pelo menos um caractere tem correspondência. \. indica um caractere de ponto (.) exigido. E o restante corresponde a outra string de pelo menos um destes caracteres: a-z, 0-9, _ ou-. A parte do padrão definido pela string optionalUrlPart corresponde a nenhum ou mais destes caracteres: um ponto (.) seguido por qualquer número de caracteres alfanuméricos (incluindo _ e -). O quantificador * indica que nenhum ou mais caracteres têm correspondência. A chamada do método replace() aplica a expressão regular e monta a string HTML de substituição, utilizando referências anteriores. O método urlToATag() chama o método emailToATag(), que usa técnicas semelhantes para substituir padrões de email por string de hiperlinks HTML <a>. As expressões regulares utilizadas para corresponder HTTP, FTP e URLs de email nesse arquivo de amostra são muito simples, com o objetivo de exemplificação; há expressões regulares muito mais complicadas para correspondência com esses URLs. Conversão de strings de dólar americano para strings de euroQuando o usuário clica no botão Testar do aplicativo de exemplo, se ele marcou a caixa de seleção dollarToEuro, o aplicativo chama o método estático CurrencyConverter.usdToEuro() para converter as strings com dólares norte-americanos (como "$9,95") em strings com euros (como "8,24 €"), da seguinte maneira: var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; return input.replace(usdPrice, usdStrToEuroStr); A primeira linha define um padrão simples para correspondência de strings de dólar americano. Observe que o caractere $ é precedido por um caractere escape de barra invertida (\). O método replace() usa a expressão regular como o correspondente padrão e chama a função usdStrToEuroStr() para determinar a string de substituição (um valor em euros). Quando um nome de função for utilizado como o parâmetro secundário do método replace(), o seguinte será transmitido como parâmetros para a função chamada:
O método usdStrToEuroStr() converte padrões de string de dólar americano para string de euro, como se segue: private function usdToEuro(...args):String { var usd:String = args[1]; usd = usd.replace(",", ""); var exchangeRate:Number = 0.828017; var euro:Number = Number(usd) * exchangeRate; trace(usd, Number(usd), euro); const euroSymbol:String = String.fromCharCode(8364); // € return euro.toFixed(2) + " " + euroSymbol; } Observe que args[1] representa o grupo entre parênteses capturado, correspondido pela expressão regular usdPrice. Essa é uma parte numérica da string de dólar americano: isto é, a quantidade de dólar sem o sinal $. O método aplica uma conversão de taxa de câmbio e retorna a string resultante (com o símbolo € à direita em vez do símbolo $ à esquerda). |
![]() |