Passamos o desafio RegexPlay 100%

O desafio do Machine Learning Lab da Universidade de Trieste (Itália) oferece a solução de 12 problemas e o nível de tarefas varia muito - de super fácil a difícil.


Obviamente, pode haver mais de uma solução, e os casos de teste no problema não cobrem todas as opções. No entanto, se você marcar 100%, parabéns! Teste aprovado.


Spoiler: em algumas tarefas (especialmente as leves), uma dica é praticamente uma solução.


Tarefa 1 - encontre os números


Há texto contendo números, você precisa encontrar todos os números.


Dificuldade: super fácil.


Sugestão

Você precisa usar um caractere de dígito e um quantificador multiplicador.


Solução
\ d +

"[0-9] +" também é a decisão certa.


Solução de análise
  • "\ d" ou "[0-9]" - qualquer caractere único de 0 a 9.
  • "+" - um ou mais caracteres são permitidos.

Tarefa 2 - encontre endereços mac


Há texto contendo endereços MAC, você precisa encontrá-los.


Dificuldade: fácil.


Sugestão

Você precisa usar um caractere que significa qualquer caractere de uma letra ou número, dois pontos para separar e um quantificador multiplicador.


Solução
\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}

"+" em vez de "{2}" também é a decisão certa, embora não seja totalmente precisa.


Solução de análise
  • "\ w" é qualquer caractere do alfabeto ou qualquer número.
  • "{2}" - apenas 2 caracteres são permitidos.

Melhor solução

Aqueles familiarizados com o endereço mac notaram que o endereço mac está escrito em notação hexadecimal. E na solução anterior, o sinal \ w foi usado, o que significa qualquer caractere do alfabeto e todos os números. Concordo, provavelmente isso é desnecessário, mas você pode levar isso em conta, ao mesmo tempo reduzindo a regularidade.


([\ da-f] {2} :) {5} [\ da-f] {2}

Solução de análise
  • "\ d" é qualquer dígito único, "af" é um intervalo de a a f. No total, temos um conjunto de caracteres válido 0123456789abcdef - ou seja, o código hexadecimal Hex. "{2}" - quaisquer 2 caracteres deste conjunto de caracteres.
  • "([\ da-f] {2} :)" {5} - repetir dois caracteres hex + dois pontos é permitido exatamente 5 vezes.
  • e no final de "[\ da-f] {2}" - quaisquer 2 caracteres do conjunto hexadecimal

Tarefa 3 - encontre endereços ftp


Há texto com endereços FTP, você precisa encontrá-los.


Dificuldade: fácil.


Sugestão

Você precisa começar com ftp: // e listar os caracteres válidos no endereço, sem esquecer o quantificador multiplicador.


Solução
ftp: \ / \ / [\ w \ d -_. \ /] +

Solução de análise
  • "\ /" - escape normal do caractere "/".
  • colchetes internos é uma enumeração de caracteres válidos, ou seja, qualquer caractere no alfabeto ou qualquer número, hífen, sublinhado, ponto ou barra (se houver outros caracteres no nome, você poderá adicioná-los).

Tarefa 4 - encontre um modelo


Há algum tipo de arquivo formatado no qual você precisa encontrar todas as linhas correspondentes ao padrão $ any characters $.


Dificuldade: fácil.


Sugestão

Você precisa usar o escape do caractere reservado, o caractere de qualquer caractere, quantificadores de multiplicidade e preguiçoso.


Solução

Uma tarefa comum, mas requer um conhecimento um pouco melhor dos regulares.


\\ $. +? \\ $

Solução de análise
  • "\\ $" é a triagem do dólar.
  • ". +" - qualquer número de caracteres, "?" - remover a ganância.

Tarefa 5 - encontre endereços IP


Encontre endereços IP a partir do texto.


Dificuldade: fácil.


Sugestão

Muito parecido com a segunda tarefa.


Solução
\ d + \. \ d + \. \ d + \. \ d +

Se em vez de "+" você escreveu "{1,3}", está pronto.


Solução de análise
  • "\ d" é qualquer dígito único,
  • "+" - qualquer número de caracteres, "{1,3}" - uma restrição estrita ao número de caracteres (de 1 a 3).

Melhor solução

Um endereço IP não é apenas números, mas números de 0 a 255.


\ b ((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} (\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \ b

Solução de análise

Para determinar o intervalo de 0 a 255, você precisará tentar um pouco:


  • "\ d" é um número de 0 a 9
  • "[1-9] \ d" - um número de 10 a 99
  • "1 \ d {2}" - um número de 100 a 199
  • "2 [0-4] \ d" - um número de 200 a 249
  • "25 [0-5]" - de 250 a 255

A seguir, permitimos a repetição do padrão de dígitos de 0 a 255 exatamente 3 vezes:


  • "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - dentro do ponto, porque também repetido 3 vezes e no final o mesmo intervalo de números, mas sem um ponto.
  • no final e no início, adicionamos o símbolo de borda da palavra "\ b" - é necessário para remover o texto "1172.30.42.109" da entrada (concordo que é improvável e provavelmente desnecessário).

Tarefa 6 - Âncora


Puxe a tag href do documento html.


Dificuldade: média.


Sugestão

Use "qualquer caractere, exceto" e "ou" para cada parêntese.


Solução
href = ("[^"] + "| '[^'] + ')

Solução de análise
  • "- inicie a pesquisa com aspas duplas.
  • "[^"] + "- ainda mais qualquer caractere, exceto aspas duplas.
  • Terminamos com aspas duplas.

Colocamos tudo isso entre parênteses, acrescentamos o sinal ou - "|" e repita o mesmo para aspas simples.


Tarefa 7 - Links


Em qualquer texto, encontre todos os links. A tarefa é complicada pelo fato de não ser suficiente apenas encontrar o link; você precisa descartar caracteres inválidos no final.


Dificuldade: difícil.


Sugestão

Você precisa começar com http, usar "qualquer caractere, exceto" e finalizar a pesquisa com um caractere válido.


Solução
http: \ / \ / ([^> \ s] +) [\ w \ /]

Não há links https na tarefa, mas você pode levar isso em consideração adicionando "s?" depois de http.


Solução de análise
  • "[^> \ s] +" procura quaisquer caracteres, exceto o caractere ">" e o caractere de espaço. De fato, você pode ler assim "vamos até vermos um desses símbolos".
  • "[\ w \ /]" é um delimitador que permite que um link termine apenas com um caractere latino ou uma barra.

E no final - começamos com http: //, então absolutamente qualquer caractere, exceto os caracteres "<" ou espaço, mas no final o caractere ou barra latino é necessário.


  • "s extras"? em "https?" apenas permita "http: //" e "https: //".

Tarefa 8 - Cabeçalhos


Em HTML, um cabeçalho é qualquer tag h + digit.


Dificuldade: média.


Sugestão

Comece com h + dígito + qualquer caractere ou sua ausência.


Solução

Bem simples:


<h \ d. *>. * <\ / h \ d. *>

Solução de análise
  • "h \ d" - aqui dizemos que após o caractere deve necessariamente ir "\ d" dígito.
  • E então ". *" Pode ir com qualquer número de caracteres ou nada pode ir.

Melhor solução

Depois que h chega um dígito, e na especificação html, é indicado que os números de 1 a 6 são válidos e a própria tag não pode ser fechada por nada além de colchetes triangulares. Portanto, esta solução será mais precisa:


<h [1-6] [^>] *>. +? <\ / h [1-6]>

É verdade que existe um erro que permite abrir a etiqueta com um dígito e fechar o outro. E, portanto, uma solução ainda mais precisa seria usar os links: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Isso não quer dizer que o teste não diferencia maiúsculas de minúsculas.


Solução de análise
  • "h [1-6]" - aqui dizemos que depois de "h" o número deve ir de 1 a 6.
  • "[^>] *" - qualquer caractere, exceto ">", pode continuar ou não.

Separadamente, sobre a adição:


  • Embrulhando a expressão "(h [1-6])" entre colchetes, criamos um grupo no número 1.
  • Além disso, usando o link para o primeiro grupo "\ 1", falamos sobre o que queremos ver no final do mesmo, h com o mesmo número do início.

Tarefa 9 - Telefones


Em texto livre encontrado em todos os telefones em diferentes formatos.


Dificuldade: difícil.


Sugestão

É necessário usar o sinal da presença de um símbolo ou sua ausência, um quantificador para limitar o número de dígitos e a construção de um conjunto de caracteres. Projeto possível ou.


Solução
\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}

Funcionará, mas permitirá dois caracteres após os três primeiros dígitos - é bom se for um colchete de fechamento e um espaço depois dele, mas é ruim se houver dois hífens. Portanto, existe uma solução um pouco mais precisa: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"


Solução de análise
  • "\ (?" - indicamos a possibilidade da presença do símbolo "(" ou a sua ausência, protegemos porque é um símbolo reservado.
  • "\ d {3}" - dígitos com uma restrição de apenas 3.
  • Caracteres adicionais "[\). \ / -] {1,2}" são possíveis - barra, parêntese de fechamento, ponto, espaço, barra invertida e hífen. {1,2} - diz que esses caracteres podem ser 1 ou 2. Por exemplo, o colchete de fechamento e o espaço após ele.
  • Além disso, necessariamente "[-.]" - um hífen ou ponto final.
  • E "\ d {4}" são os quatro dígitos no final.

Tarefa 10 - Autores


Há um certo padrão que contém elementos, encontre todos os autores no campo do autor.


Dificuldade: muito difícil.


Sugestão

É necessário confiar no fato de que todos os nomes de autores começam com uma letra maiúscula e são escritos em um padrão.


Solução
[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?

Esta solução está correta, mas tem um sinal de menos. Andamos "{\" u} com uma "muleta" ({\ "\ w})?" e, basicamente, é viável se você também colocar essa muleta em outras partes dos nomes dos autores.


De qualquer forma, se você conseguiu resolver esse problema de alguma forma, isso é muito legal!


Solução de análise
  • "[AZ] [A-Za-z - '] +" - Estamos procurando uma palavra que necessariamente comece com uma letra maiúscula e, em seguida, contenha qualquer caractere do alfabeto, hífen ou apóstrofo.
  • Além disso, tudo é exatamente o mesmo que um pouco mais alto, mas aqui entre nós temos "({\" \ w})? "- é apenas uma muleta que permite ignorar a blindagem. Isso significa que um pedaço de" {\ "u}" pode estar presente ou estar ausente.
  • E, novamente, exatamente a mesma coisa que no primeiro caso "([AZ] [A-Za-z - '] *)?", O aviso é com a exceção de que essa expressão está agrupada em um grupo e existe um "?" significando não vincular essa condição.

A enumeração PS [A-Za-z] aqui é uma medida necessária, porque não há modificadores no teste.


Melhor solução

Existe uma solução mais compacta e simples que permite abandonar a muleta acima:


[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B

Solução de análise
  • "[AZ] \ S +," - primeiro, necessariamente, a letra maiúscula "[AZ]" e, em seguida, qualquer número de caracteres que não sejam espaços em branco "\ S +" para o ponto e vírgula ",".
  • Além disso, quase o mesmo "[AZ] \ S *" - o início é necessariamente com uma letra maiúscula e, em seguida, qualquer caractere que não seja um espaço em branco na borda da palavra "\ b".
  • "([AZ] [\ S] *)?" - e entre eles o mesmo grupo, mas não obrigatório, para um nome do meio.

Tarefa 11 - Conteúdo do cabeçalho


Assim como na tarefa 8, mas você precisa encontrar não os cabeçalhos, mas o conteúdo deles.


Dificuldade: difícil.


Sugestão

A tarefa é idêntica à tarefa 8. Não é difícil se você souber olhar para frente e para trás. Tem uma solução com olhar para trás e sem olhar para trás.


Solução

Sem olhar para trás:


([\ w] * <[^ h]. + | [^ <>] +) (? = <\ / h \ d>)

Solução de análise
  • "([\ w] * <[^ h]. + | [^ <>] +)" - há duas opções para como o conteúdo do cabeçalho pode começar. O primeiro é com a tag dentro de "[\ w] * <[^ h]. +" - ao mesmo tempo, você precisa ter certeza de que não é a tag h e levar em consideração que pode haver texto antes da tag. A segunda opção é o texto sem as tags "[^ <>] +", ou seja, quaisquer caracteres que não sejam a abertura e o fechamento da tag.
  • "(? = <\ / h \ d>)" - olhando para o futuro, dentro do qual deve haver uma marca de fechamento h.

Olhando para trás:


(? <= <h [^>] +>). +? (? = <\ / h \ d>)

Além disso, você pode levar em consideração todos os comentários sobre a solução 8 do problema.


Solução de análise
  • "(? <= <h [^>] +>)" - espiando de volta para dentro da qual deve haver uma tag h.
  • "(? = <\ / h \ d>)" - olhando para o futuro, dentro do qual deve haver uma marca de fechamento h.

Tarefa 12 - Lista de autores


A tarefa é semelhante à 10ª, mas na minha opinião é mais fácil.


Dificuldade: difícil.


Sugestão

Todos os princípios básicos das 10 tarefas, mas você precisa considerar o início da linha. A solução que eu conheço usa espreitar de volta.


Solução
(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +

Solução de análise
  • "(? <= ^ \ d +.)" - olhando para trás, onde você deve ter qualquer número de dígitos até o ponto com um espaço de uma nova linha.
  • "[AZ] [\ w] +," - acrescente qualquer palavra de uma letra maiúscula a um ponto e vírgula e mais uma vez o mesmo "[AZ] [\ w.] +".

Ou simplesmente:


(? <= ^ \ d + \.) [^,] +, [^,:] +

Solução de análise
  • "(? <= ^ \ d +.)" - olhando para trás, onde você deve ter qualquer número de dígitos até o ponto com um espaço de uma nova linha.
  • "[^,] +," - qualquer número de caracteres para a vírgula + vírgula.
  • "[^,:] +" - qualquer número de caracteres antes da vírgula ou dois pontos.

Source: https://habr.com/ru/post/pt472110/


All Articles