Nous relevons le défi RegexPlay 100%

Le défi du Machine Learning Lab de l'Université de Trieste (Italie) propose de résoudre 12 problèmes et le niveau des tâches varie considérablement - de très facile à difficile.


Bien sûr, il peut y avoir plus d'une solution et les cas de test dans le problème ne couvrent pas toutes les options. Néanmoins, si vous marquez 100%, alors félicitations! Test réussi.


Spoiler: dans certaines tâches (surtout les plus légères), un indice est pratiquement une solution.


Tâche 1 - trouver les chiffres


Il y a du texte contenant des nombres, vous devez trouver tous les nombres.


Difficulté: super facile.


Indice

Vous devez utiliser un caractère numérique et un quantificateur multiplicateur.


Solution
\ d +

"[0-9] +" est également la bonne décision.


Solution d'analyse
  • "\ d" ou "[0-9]" - n'importe quel caractère unique de 0 à 9.
  • "+" - un ou plusieurs caractères sont autorisés.

Tâche 2 - Rechercher des adresses MAC


Il y a du texte contenant des adresses mac, vous devez les trouver.


Difficulté: facile.


Indice

Vous devez utiliser un caractère signifiant n'importe quel caractère d'une lettre ou d'un chiffre, deux points pour séparer et un quantificateur multiplicateur.


Solution
\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}

"+" au lieu de "{2}" est également la bonne décision, bien qu'elle ne soit pas tout à fait exacte.


Solution d'analyse
  • "\ w" est n'importe quel caractère de l'alphabet ou n'importe quel nombre.
  • "{2}" - seuls 2 caractères sont autorisés.

La meilleure solution

Ceux qui connaissent l'adresse mac ont remarqué que l'adresse mac est écrite en notation hexadécimale. Et dans la solution précédente, le signe \ w était utilisé, ce qui signifie n'importe quel caractère de l'alphabet et tous les nombres. Je suis d'accord, ce n'est probablement pas nécessaire, mais vous pouvez en tenir compte, tout en réduisant la régularité.


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

Solution d'analyse
  • "\ d" est un chiffre unique, "af" est une plage de a à f. Au total, nous avons un jeu de caractères valide 0123456789abcdef - c'est-à-dire le code hexadécimal Hex. "{2}" - 2 caractères quelconques de ce jeu de caractères.
  • "([\ da-f] {2} :)" {5} - la répétition de deux caractères hex + deux points est autorisée exactement 5 fois.
  • et à la fin de "[\ da-f] {2}" - 2 caractères quelconques de l'ensemble hexadécimal

Tâche 3 - Rechercher des adresses FTP


Il y a du texte avec des adresses ftp, vous devez les trouver.


Difficulté: facile.


Indice

Vous devez commencer par ftp: // puis lister les caractères valides dans l'adresse, sans oublier le quantificateur multiplicateur.


Solution
ftp: \ / \ / [\ w \ d -_. \ /] +

Solution d'analyse
  • "\ /" - échappement normal du caractère "/".
  • entre crochets se trouve une énumération de caractères valides, à savoir n'importe quel caractère de l'alphabet ou n'importe quel nombre, trait d'union, trait de soulignement, point ou barre oblique (s'il y a d'autres caractères dans le nom, vous pouvez les ajouter).

Tâche 4 - trouver un modèle


Il existe une sorte de fichier formaté dans lequel vous devez trouver toutes les lignes correspondant au motif $ tous les caractères $.


Difficulté: facile.


Indice

Vous devez utiliser l'échappement du caractère réservé, le caractère de n'importe quel caractère, les quantificateurs de multiplicité et les paresseux.


Solution

Une tâche banale, mais qui nécessite une meilleure connaissance des habitués.


\\ $. +? \\ $

Solution d'analyse
  • "\\ $" est la projection en dollars.
  • ". +" - n'importe quel nombre de caractères, "?" - supprimer la cupidité.

Tâche 5 - Rechercher des adresses IP


Trouvez des adresses IP dans le texte.


Difficulté: facile.


Indice

Très similaire à la deuxième tâche.


Solution
\ d + \. \ d + \. \ d + \. \ d +

Si au lieu de "+" vous avez écrit "{1,3}" alors vous avez terminé.


Solution d'analyse
  • "\ d" est un chiffre unique,
  • "+" - n'importe quel nombre de caractères, "{1,3}" - une restriction stricte sur le nombre de caractères (de 1 à 3).

La meilleure solution

Une adresse IP n'est pas seulement des nombres, mais des nombres de 0 à 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

Solution d'analyse

Pour déterminer la plage de 0 à 255, vous devrez essayer un peu:


  • "\ d" est un nombre de 0 à 9
  • "[1-9] \ d" - un nombre de 10 à 99
  • "1 \ d {2}" - un nombre de 100 à 199
  • "2 [0-4] \ d" - un nombre de 200 à 249
  • "25 [0-5]" - chilso de 250 à 255

Ensuite, nous autorisons la répétition du motif numérique de 0 à 255 exactement 3 fois:


  • "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - à l'intérieur du point, car il répété 3 fois et à la fin la même gamme de chiffres, mais sans point.
  • à la fin et au début, nous ajoutons le symbole de bordure du mot "\ b" - il est nécessaire pour supprimer ce texte "1172.30.42.109" de l'entrée (je suis d'accord, il est peu probable et probablement inutile).

Tâche 6 - Ancre


Tirez la balise href du document html.


Difficulté: moyenne.


Indice

Utilisez "n'importe quel caractère sauf" et "ou" pour chaque parenthèse.


Solution
href = ("[^"] + "| '[^'] + ')

Solution d'analyse
  • "- lancez la recherche avec un double guillemet.
  • "[^"] + "- encore plus n'importe quel caractère, sauf les guillemets doubles.
  • Nous terminons par une double citation.

Nous mettons tout cela entre parenthèses, ajoutons le signe ou - "|" et répétez la même chose pour les guillemets simples.


Tâche 7 - Liens


Dans n'importe quel texte, trouvez tous les liens. La tâche est compliquée par le fait qu'il ne suffit pas de trouver le lien, vous devez supprimer les caractères invalides à la fin.


Difficulté: difficile.


Indice

Vous devez commencer par http, utiliser "n'importe quel caractère sauf" et terminer la recherche avec un caractère valide.


Solution
http: \ / \ / ([^> \ s] +) [\ w \ /]

Il n'y a pas de lien https dans la tâche, mais vous pouvez en tenir compte en ajoutant "s?" après http.


Solution d'analyse
  • "[^> \ s] +" recherche tous les caractères sauf le caractère ">" et le caractère espace. En fait, vous pouvez lire comme ceci "nous allons jusqu'à ce que nous voyions un de ces symboles."
  • "[\ w \ /]" est un délimiteur qui permet à un lien de se terminer uniquement par un caractère latin ou une barre oblique.

Et en conséquence - nous commençons par http: //, puis absolument n'importe quel caractère à l'exception des caractères "<" ou de l'espace, mais à la fin, le caractère latin ou la barre oblique est requis.


  • "s?" supplémentaire dans "https?" autorisez simplement "http: //" et "https: //".

Tâche 8 - En-têtes


En HTML, un en-tête est une balise h + chiffre.


Difficulté: moyenne.


Indice

Commencez par h + chiffre + n'importe quel caractère ou son absence.


Solution

Assez simple:


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

Solution d'analyse
  • "h \ d" - ici, nous disons qu'après le caractère doit nécessairement aller "\ d" chiffre.
  • Et puis ". *" Peut aller n'importe quel nombre de caractères ou rien ne peut aller.

La meilleure solution

Après h vient un chiffre, et la spécification html indique que les nombres de 1 à 6 sont valides, et la balise elle-même ne peut pas être fermée par autre chose que des crochets triangulaires. Par conséquent, cette solution sera plus précise:


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

Certes, il y a une erreur vous permettant d'ouvrir la balise avec un chiffre et de fermer l'autre. Et par conséquent, une solution encore plus précise serait d'utiliser les liens: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Cela ne veut pas dire que le test n'est pas sensible à la casse.


Solution d'analyse
  • "h [1-6]" - ici nous disons qu'après "h" le nombre doit aller de 1 à 6.
  • "[^>] *" - tout caractère sauf ">" peut continuer ou ne pas continuer.

Séparément, sur l'ajout:


  • En enveloppant l'expression "(h [1-6])" entre crochets, nous créons un groupe au numéro 1.
  • De plus, en utilisant le lien vers le premier groupe "\ 1", nous parlons de ce que nous voulons voir à la fin de la même, h avec le même nombre qu'au début.

Tâche 9 - Téléphones


En texte libre trouvé dans tous les téléphones dans différents formats.


Difficulté: difficile.


Indice

Il faut utiliser le signe de la présence d'un symbole ou de son absence, un quantificateur pour limiter le nombre de chiffres, et la construction d'un jeu de caractères. Conception possible ou.


Solution
\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}

Cela fonctionnera, mais il autorise deux caractères après les trois premiers chiffres - c'est bien si c'est une parenthèse fermante et un espace après, mais c'est mauvais s'il y a deux tirets. Par conséquent, il existe une solution légèrement plus précise: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"


Solution d'analyse
  • "\ (?" - nous indiquons la possibilité de la présence du symbole "(" ou son absence, nous le bouclons puisqu'il s'agit d'un symbole réservé.
  • "\ d {3}" - chiffres avec une restriction de seulement 3.
  • D'autres caractères "[\). \ / -] {1,2}" sont possibles - barre oblique, parenthèse fermante, point, espace, barre oblique inverse et trait d'union. {1,2} - indique que ces caractères peuvent être 1 ou 2. Par exemple, le crochet de fermeture et l'espace après celui-ci.
  • En outre nécessairement "[-.]" - un tiret ou une période.
  • Et "\ d {4}" correspond aux quatre chiffres à la fin.

Tâche 10 - Auteurs


Il y a un certain modèle contenant des éléments, trouvez tous les auteurs dans le champ auteur.


Difficulté: très difficile.


Indice

Il est nécessaire de s'appuyer sur le fait que tous les noms d'auteurs commencent par une majuscule et sont écrits selon un modèle.


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

Cette solution est correcte, mais elle a un inconvénient. Nous nous sommes promenés "{\" u} avec une "béquille" ({\ "\ w})?" et, fondamentalement, cela peut fonctionner si vous mettez également cette béquille dans d'autres parties du nom des auteurs.


Dans tous les cas, si vous avez réussi à résoudre ce problème, c'est très cool!


Solution d'analyse
  • "[AZ] [A-Za-z - '] +" - Nous recherchons un mot qui commence nécessairement par une majuscule, puis contient tout caractère alphabétique, trait d'union ou apostrophe.
  • De plus, tout est exactement la même chose qu'un peu plus haut, mais ici entre nous avons "({\" \ w})? "- c'est juste une béquille qui vous permet de contourner le blindage. Cela signifie qu'un morceau de" {\ "u}" peut être présent ou être absent.
  • Et là encore, exactement la même chose que dans le premier cas "([AZ] [A-Za-z - '] *)?", La remarque est à l'exception que cette expression est enveloppée dans un groupe et qu'il y a un "?" ce qui signifie ne pas lier cette condition.

L'énumération PS [A-Za-z] est ici une mesure nécessaire, car il n'y a pas de modificateurs dans le test.


La meilleure solution

Il existe une solution plus compacte et simple qui vous permet d'abandonner la béquille ci-dessus:


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

Solution d'analyse
  • "[AZ] \ S +", - d'abord, nécessairement, la lettre majuscule "[AZ]", puis n'importe quel nombre de caractères non blancs "\ S +" jusqu'au point-virgule ",".
  • En outre, presque le même "[AZ] \ S *" - le début est nécessairement avec une lettre majuscule, puis tout caractère non blanc à la frontière du mot "\ b".
  • "([AZ] [\ S] *)?" - et entre eux le même groupe, mais pas obligatoire, pour un deuxième prénom.

Tâche 11 - Contenu de l'en-tête


Tout comme dans la tâche 8, mais vous devez trouver non pas les en-têtes eux-mêmes, mais leur contenu.


Difficulté: difficile.


Indice

La tâche est identique à la tâche 8. Ce n'est pas difficile si vous savez regarder en arrière. A une solution avec regarder en arrière et sans regarder en arrière.


Solution

Sans regarder en arrière:


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

Solution d'analyse
  • "([\ w] * <[^ h]. + | [^ <>] +)" - il existe deux options pour commencer le contenu de l'en-tête. La première est avec la balise à l'intérieur de "[\ w] * <[^ h]. +" - en même temps, vous devez vous assurer que ce n'est pas la balise h et tenir compte du fait qu'il peut y avoir du texte avant la balise. La deuxième option est le texte sans balises "[^ <>] +", c'est-à-dire tous les caractères autres que l'ouverture et la fermeture de la balise.
  • "(? = <\ / h \ d>)" - regardant vers l'avant, à l'intérieur duquel il devrait y avoir une balise de fermeture h.

Rétrospective:


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

De plus, vous pouvez prendre en compte tous les commentaires sur la solution 8 du problème.


Solution d'analyse
  • "(? <= <h [^>] +>)" - jetant un coup d'œil à l'intérieur de laquelle devrait être une balise h.
  • "(? = <\ / h \ d>)" - regardant vers l'avant, à l'intérieur duquel il devrait y avoir une balise de fermeture h.

Tâche 12 - Liste des auteurs


La tâche est similaire à la 10e tâche, mais à mon avis est plus facile.


Difficulté: difficile.


Indice

Tous les principes de base des 10 tâches, mais vous devez considérer le début de la ligne. La solution que je connais utilise un coup d'œil en arrière.


Solution
(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +

Solution d'analyse
  • "(? <= ^ \ d +.)" - en regardant en arrière où vous devez avoir n'importe quel nombre de chiffres jusqu'au point avec un espace à partir d'une nouvelle ligne.
  • "[AZ] [\ w] +", - déplacez n'importe quel mot d'une lettre majuscule vers un point-virgule et encore une fois le même "[AZ] [\ w.] +".

Ou simplement, ceci:


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

Solution d'analyse
  • "(? <= ^ \ d +.)" - en regardant en arrière où vous devez avoir n'importe quel nombre de chiffres jusqu'au point avec un espace à partir d'une nouvelle ligne.
  • "[^,] +," - n'importe quel nombre de caractères de la virgule + virgule.
  • "[^,:] +" - n'importe quel nombre de caractères avant la virgule ou les deux-points.

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


All Articles