Atenção! É importante as fontes de todos os fatos e dados relevantes as argumentações.
Em 12:20 vai direto ao ponto:
Para quem quer ter sua argumentação respeitada eu também sugiro conhecer
o que seja metodologia científica: Problematização, formulação da
hipótese, experimentação e confirmação, sendo este ultimo quando outros
repetem os testes.
Pois é... mais uma teoria conspiratoria sendo criada. Mas segundo o que já é praticado pelos gurus da direita, que acusam o adversário de esquerda daquilo que você pratica, então, a verdade não é que existe uma sociedade Q-anon. No Lugar de Q é B e no lugar de anon é annon:
B-annon. Steve Bannon. Que foi preso e solto ontem apos pagar fiança por desviar dinheiro de arrecadação da contrução do muro que dividirá o México e os EUA.
UNB-Matemática Autor: Luiz Augusto Prado 1807787/DF Blog: tivideotutoriais.blogspot.com
============================================ Regex: Expressões regulares em javaScript ============================================
Expressão regular é uma sequência especial de caracteres que nos permite realizar uma busca de forma genérica dentro de um texto.
O regex pode nos ajudar:
- A encontrar padrões de palavras ou suas posições dentro de um texto. Usamos: Para a posição: o método 'search()' da string (evitemos este por não ser muito útil) ou Para encontrar as posições: o método 'test()' e a propriedade 'lastIndex' do objeto Regex; Para encontrar padrões de palavras: o método 'match()' do objeto String.
- A substituir certas palavras ou padrões de palavras, por outras que desejarmos. Usamos o metodo 'replace()' do objeto String.
Usando o método search do objeto String
Se temos por exemplo a string 'txt' (variável representando um conjunto de caracteres) contendo: var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer.";
Podemos realizar a busca por uma palavra em especial, como 'conjunto', por exemplo:: var n = txt.search("conjunto");
Se existir a palavra, utilizando o método 'search()', ela adiciona a posição da primeira ocorrencia na variável 'n'. No caso, n=3.
Agora vamos complicar um pouco mais. Finalmente o assunto Regex.
O caractere '/' é o primeiro a ser aprendido. Ele substituirá as aspas e indicará ao interpretador do navegador que de agora em diante estaremos nos referindo a uma expressão regular (Regex). Ao adicionar as barras entre um conjunto de strings, criamos um objeto Regex. É o mesmo que fazer:
var objRegex = /ra/ ; var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = txt.search(objRegex);
Nesse caso teremos n=17
Se nenhuma ocorrência for encontrada teremos n=-1
Modificadores de busca do objeto Regex
Falamos anteriormente que ao substituirmos as aspas de uma variável por barras, deixamos de criar uma String para criarmos um objeto Regex. O Regex nos permite trabalhar com os modificadores, o que nos ajuda a refinar nossas buscas. Isso implica que a barra invertida poderá vir acompanhada de:
'i' busca case-insentivive. Não faz diferença entre maiúsculas e minúsculas. 'm' busca em todas as linhas. Independentemente de existir quebra de linhas '\n' 'g' busca todas as ocorrências. Evitar o método 'search()' do objeto String e veremos mais frente porquê.
Exemplo de Regex com o modificador 'i'
Se temos:
var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = txt.search(/e/i);
teremos n=13
E se temos:
var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = txt.search(/E/i);
teremos n=13
Mas se tivermos:
var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = txt.search(/u/);
teremos n=7
Ou se tivermos:
var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = txt.search(/U/);
teremos n=0
Modificador 'g', o método 'test()' e a propriedade 'latIndex' do objeto Regex para todas as ocorrências
O objeto Regex, assim como o objeto String, também possui métodos e propriedades que nos permitem realizar buscas. O problema de utilizar o método 'search()' da string sobre o objeto regex é que esse método só retorna a posição da primeira ocorrência encontrada. Mas se utilizarmos o método 'test()' do objeto Regex combinado com sua propriedade 'lastIndex' sobre a string podemos encontrar todas as ocorrências. Isso torna o método 'search()' do objeto String praticamente inútil.
Para obtermos todas as posições do regex buscado, devemos fazer assim:
var objRegex = /ra/g ; var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = [] while(objRegex.test(txt)==true) { //Onde -2 é o comprimento da string procurada n.push(objRegex.lastIndex-2) }
Onde o array n=[17,52]. Observe que o modificador utilizado foi o g, que significa que deve encontrar todas as ocorrências.
Se está entre conchetes, é um caractere
Um conjunto de caracteres entre colchetes em um regex significa que se deseja encontrar um (1) dentre os caractes citados entre colchetes. Exemplo: Se queremos as posições de todos os l e i temos:
var objRegex = /[1i]/g ; var txt = "Um conjunto de caracteres. Eu tenho 1 ou 2 coisas para dizer."; var n = [] while(objRegex.test(txt)==true) { //onde -1 é o comprimento da string procurada n.push(objRegex.lastIndex-1) }
Onde teremos um array n=[36,45,56]
Neste caso, se não for encontrado qualquer ocorrência, array n=[]. Ou seja, o array n estará vazio (n.length==0).
Exemplos de opções de caracteres:
[abc] um caractere minúsculo (sem o modificador 'i') que pode ser a, b ou c [^abc] qualquer caractere não sendo a, nem b, nem c [a-z] qualquer caractere minúsculo de a a z [^a-z] nenhum caractere de a a z [ABC] um caractere maiúsculo (sem o modificador 'i') que pode ser A, B ou C [^ABC] qualquer caractere não sendo A, nem B, nem C [A-Z] qualquer caractere maiúsculo (sem o modificador 'i') de A a Z [^A-Z] nenhum caractere de A a Z [5-9] qualquer dígito de 5 a 9 [^5-9] nenhum dígito de 5 a 9
Opções de Strings:
a(verde|azul)a Qualquer uma das strings 'averdea' ou 'aazula'
Observe que a barra '|' representa o operador lógico 'ou'.
Método 'match()', colchetes e o que não quero encontrar
Anteriormente vimos como pegar as posições das pavras que procuravamos com os métodos 'search()' do objeto String e 'test()' do objeto Regex. Agora vamos utilizar o metodo 'match()' do objeto String para capturar as palavras que desejamos.
Observe os significados:
'[]' colchetes representam um único caractere. - Qualquer sequência de caracteres entre os colchetes é uma opção de caractere - Qualquer sequência de caracteres precedido de ^ entre colchetes significa que estes caracteres não serão aceitos como válidos.
O caractere ^ dentro de um colchete significa uma coisa: negar as opções de caracteres dadas. O caractere fora de colchete significa que o caractere deve estar no início da string para ser válido.
'()' parentêses representam uma string ou conjunto de strings. - Qualquer conjunto de strings dentro de parênteses separado por uma barra '|' é considerada opção válida
Se o método 'match()' não encontrar nenhuma palavra, ele retornará valor null.
Veja os exemplos:
1 ) Quero os nomes que começem com 'Lu' e que tenham na terceira letra [í ou i] e na quarta [s ou z]
var objRegex = /lu[íi][sz]/ig ; var txt = "Luís e Luiz são nomes diferentes. Laís e Laiz também são."; var n = txt.match(objRegex)
Teremos o array n=["Luís","Luiz"]. Observe que foram utilizados os dois modificadores 'i' e 'g'.
2 ) Agora se quizermos qualquer combinação de 4 letras onde a primeira começa com L a segunda NÃO pode ser [U nem E], a terceira pode ser [Í ou I] e a quarta pode ser [S ou Z]:
var objRegex = /l[^ue][íi][sz]/ig ; var txt = "Luís e Luiz são nomes diferentes. Luís, Lois, leis, Laís e Laiz são nomes e palavras diferentes."; var n = txt.match(objRegex)
Teremos o array n=["Lois","Laís","Laiz"]. Observe que para excluir palavras com as letras em uma posição basta adicionar entre colchete o caractere '^' (sem aspas) seguido das letras que não deseja.
3 ) Se quizermos qualquer nome começando com L, na segunda letra [u ou a] na terceira letra [í ou i] na quarta letra [s ou z] e sejam finalizados por um segundo nome "Augusto", "Augusta" ou "Gustavo" temos então:
var objRegex = /l[ua][íi][sz] (Gustavo|August[ao])/ig ; var txt = "Luís Augusto, Luiz Augusto, Luiz Gustavo, Laís Augusta, e Luís Antônio são nomes diferentes."; var n = txt.match(objRegex)
Teremos um array n=["Luís Augusto","Luiz Augusto","Luiz Gustavo","Laís Augusta"]
Resumo
Fazendo um objeto Regex com modificadores i e g:
var ObjRegex = /(ba(ta){1,2}|b[ao]la)/ig ; var txt = "bata, baTaTa, bOla, bolla, BOTA, BalA" ; var n = txt.match(objRegex);
Array n=["bata","baTaTa","bOla","BalA"]
Modificadores:
'i' busca case-insentivive. Não faz diferença entre maiúsculas e minúsculas. 'm' busca em todas as linhas. Independentemente de existir quebra de linhas '\n' 'g' busca todas as ocorrências. Evitar o método 'search()' do objeto String e veremos mais frente porquê.
Caracteres:
[abc] um caractere minúsculo (sem o modificador 'i') que pode ser a, b ou c [^abc] qualquer caractere não sendo a, nem b, nem c [a-z] qualquer caractere minúsculo de a a z [^a-z] nenhum caractere de a a z [ABC] um caractere maiúsculo (sem o modificador 'i') que pode ser A, B ou C [^ABC] qualquer caractere não sendo A, nem B, nem C [A-Z] qualquer caractere maiúsculo (sem o modificador 'i') de A a Z [^A-Z] nenhum caractere de A a Z [5-9] qualquer dígito de 5 a 9 [^5-9] nenhum dígito de 5 a 9
Opções de Strings:
a(verde|azul|amarelo)a Qualquer uma das strings 'averdea' ou 'aazula' ou 'aamareloa'
Observe que a barra '|' representa o operador lógico 'ou'.
Metacaracteres:
. qualquer caractere. Menos nova linha ou fim de linha \w qualquer letra \W não pode ser letra \d qualquer dígito \D não pode ser dígito \s espaço (espaço em branco) \S não pode ser espaço \b diz que a string deve ser o início (se \b no início) ou fim da palavra (se \b no fim) \B diz que a string NÃO pode ser início (se \B no início) ou fim da palavra (se \B no fim) \0 NUL ou caractere nulo \n inicio de nova linha \f fim de página \r caractere de retorno de texto (carriage return ou retorno de carro) \t tab \v tabulação vertical \ddd um octal onde cada d é um digito que representa um octal \xdd um hexa decimal, onde cada d é um número hexadecimal \udddd um caractere unicode onde cada d é um hexadecimal para o caractere unicode
Quantificadores: Supondo que n seja um ou mais caracteres ou metacaracteres:
n+ no mínimo 1 n n* 0 ou mais n n? string n, se existir algo depois de n. Esse algo não fará parte do resultado. n{X} X sequências de n n{X,Y} de X sequências de n até Y sequências de n n{X,} X sequências de n ou mais n$ string n se no fim da linha ^n string n se inicio de linha ?=n qualquer caractere seguido de n ?!n qualquer caractere se não seguido de n
Para melhor indicação de onde aplicar os quantificadores, coloque o n entre '()' parênteses
Exemplo
Um validador simples de e-mail
Observe que é necessário impedir caracteres especiais, portanto, em uma primeira condicional nós os excluimos
E-mail: ⛔ Digite um e-mail válido.
Código fonte:
<script>
function limparEmail() { document.getElementById('validadorEmail').value=""; var validadorInfo = document.getElementById('validadorEmailInfo'); validadorInfo.style.color='#ff0000'; validadorInfo.innerHTML=" Digite um e-mail válido. "; }
function validarEmail() { var validador = document.getElementById('validadorEmail') var validadorInfo = document.getElementById('validadorEmailInfo') var regexEspeciais = /([\!\#\$\%\¨\"\'\*\(\)\[\]\|\?\:\;\>\<\,\t\r\f\n\v\0\^\~\}\{\'\`\+\=\°\º\§\¹\²\³\£\¢]|(\\u\d\d\d\d)|(\\x\d\d)|(\\u\d\d\d\d))/ ; var regexEmail = /^[a-z]((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+@([a-z]|[0-9])((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+[\\.]([a-z]|[0-9])([a-z]|[0-9])+([\\.](([a-z]|[0-9])([a-z]|[0-9])+))*$/ ; var condicional1 = validador.value.trim().search(regexEspeciais); var condicional2 = validador.value.trim().search(regexEmail); if( condicional1!=-1 || condicional2==-1 ) { validadorInfo.style.color='#ff0000' validadorInfo.innerHTML=" Digite um e-mail válido. " } else { validadorInfo.style.color='#008800' validadorInfo.innerHTML=" Este e-mail é válido. " } }
O Regex de escape são caracteres comumente recusados em validadores O Regex de validação inicial é para e-mail. Ao encontrar sequências de caracteres equivalentes ao regex de validação elas e suas posições serão mostradas.
Regex de escape:
Regex de validação:
Campo de validação:
Resultados:
Código fonte:
<script> function limparCampo() { document.getElementById('validadorCampo').value=""; } function limparEscape() { document.getElementById('validadorEscape').value=""; } function limparRegex() { document.getElementById('validadorRegex').value=""; } function validarCampo() { var txt1 = document.getElementById('validadorEscape').value.trim() var txt2 = document.getElementById('validadorRegex').value.trim() var validadorCampo = document.getElementById('validadorCampo').value var resultados = document.getElementById('resultados') resultados.innerText = ""; var objRegex1 = /\/.*\// var objRegex2 = /\/.*\/([igm])*/; var n1 = txt1.search(objRegex1); var n2 = txt2.search(objRegex2); if(n1!=null && n2!=null && n1!=-1 && n2!=-1) { var objModifRegex = /([img]*)$/ n1 = txt1.match(objModifRegex) var modf1 = txt1.substring(1,txt1.length - n1[0].length-1); var regexExcluir = new RegExp(modf1, n1[0]) var condicional1 = validadorCampo.search(regexExcluir); if( condicional1!=-1 ) { resultados.innerText="O caractere "+ validadorCampo.charAt(condicional1) +" não é aceito!" } else { n2 = txt2.match(objModifRegex) var modf2 = txt2.substring(1,txt2.length - n2[0].length-1); var regexAceitar = new RegExp(modf2, n2[0].replace('g','')+'g' ) // o modificador g não pode srr retirado aqui! var arrayString = validadorCampo.match(regexAceitar) var x=0; while(regexAceitar.test(validadorCampo)==true ) { resultados.innerHTML += arrayString[x] +" → posição: "+(regexAceitar.lastIndex - arrayString[x].length)+"<br/>" x++; } } } else { resultados.innerText += "Qualquer Regex deve estar entre barras invertidas" ; } } function load() { var txt1 = document.getElementById('validadorEscape'); var txt2 = document.getElementById('validadorRegex'); var regexEspeciais = /([\!\#\$\%\¨\"\'\*\(\)\[\]\|\?\:\;\>\<\,\t\r\f\n\v\0\^\~\}\{\'\`\+\=\°\º\§\¹\²\³\£\¢]|(\\u\d\d\d\d)|(\\x\d\d)|(\\u\d\d\d\d))/ ; var regexEmail = /^[a-z]((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+@([a-z]|[0-9])((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+((([\\.]|[\\_]|[\\-])([a-z]|[0-9])|([a-z]|[0-9])))+[\\.]([a-z]|[0-9])([a-z]|[0-9])+([\\.](([a-z]|[0-9])([a-z]|[0-9])+))*$/ ; txt1.value = regexEspeciais; txt2.value = regexEmail; } </script> <table style="font-family:arial, monospace; font-size:12;" > <tr> <td colspan="2"> O Regex de escape são caracteres comumente recusados em validadores<br> O Regex de validação inicial é para e-mail.<br> Ao encontrar sequências de caracteres equivalentes ao regex de validação elas e suas posições serão mostradas. </td> </tr> <tr> <td> Regex de escape: </td> <td> <input id='validadorEscape' type='text' size='60' style="font-family:arial, monospace; font-size:12;" /> </td> </tr> <tr> <td> Regex de validação: </td> <td> <input id='validadorRegex' type='text' size='60' style="font-family:arial, monospace; font-size:12;" /> </td> <td> </td> </tr> <tr> <td colspan="2"> Campo de validação: </td> </tr> <tr> <td colspan="2"> <textarea id='validadorCampo' cols="82" rows="7" type='text' size='60' style="font-family:arial, monospace; font-size:12;" ></textarea> </td> </tr> <tr> <td colspan="2"> <input type='button' value='Limpar Escapes' onclick='limparEscape()' /> <input type='button' value='Limpar Regex' onclick='limparRegex()' /> <input type='button' value='Limpar Campo' onclick='limparCampo()'/> <input type='button' value='Verificar' onclick='validarCampo()'/> </td> </tr> <tr> <td colspan="2"> Resultados: <div id="resultados" style="border:solid thin #bbbbbb; "><br/><br/><br/></div> </td> </tr> </table> <script> load(); </script>