Les expressions régulières (Regular Expression) fournissent une méthode efficace et pratique pour la correspondance de modèles de chaînes. Presque tous les langages de haut niveau prennent en charge les expressions régulières ou fournissent des bibliothèques de codes prêtes à l'emploi pour les appels. Cet article prend comme exemple les tâches de traitement courantes dans l'environnement ASP pour présenter les compétences d'application des expressions régulières.
1. Vérifiez le format des mots de passe et des adresses e-mail.
Notre premier exemple démontre une fonction de base des expressions régulières : décrire de manière abstraite des chaînes arbitrairement complexes. Cela signifie que les expressions régulières donnent aux programmeurs une méthode formelle de description de chaîne qui peut décrire n'importe quel modèle de chaîne rencontré par l'application avec seulement une petite quantité de code. Par exemple, pour les personnes qui ne sont pas engagées dans des travaux techniques, les exigences relatives au format du mot de passe peuvent être décrites comme suit : le premier caractère du mot de passe doit être une lettre, le mot de passe doit comporter au moins 4 caractères et au maximum 15 caractères, le mot de passe ne peut contenir que des lettres, des chiffres et des caractères autres que le trait de soulignement.
En tant que programmeurs, nous devons convertir la description en langage naturel ci-dessus du format de mot de passe sous d'autres formes afin que la page ASP puisse la comprendre et l'appliquer pour empêcher la saisie illégale de mots de passe. L'expression régulière décrivant ce format de mot de passe est : ^[a-zA-Z]w{3,14}$.
Dans les applications ASP, nous pouvons écrire le processus de vérification du mot de passe sous la forme d'une fonction réutilisable, comme indiqué ci-dessous :
Fonction TestPassword(strPassword)
Dim ré
Définir re = new RegExp
re.IgnoreCase = false
re.global = faux
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
End Function
Ci-dessous, nous comparons l'expression régulière permettant de vérifier le format du mot de passe avec la description en langage naturel :
le premier caractère du mot de passe doit être une lettre : la description de l'expression régulière est "^[a-zA-Z]", où " ^" indique le début de la chaîne et le trait d'union indique à RegExp de faire correspondre tous les caractères de la plage spécifiée.
Le mot de passe doit comporter au moins 4 caractères et pas plus de 15 caractères : la description de l'expression régulière est "{3,14}".
Le mot de passe ne peut pas contenir de caractères autres que des lettres, des chiffres et des traits de soulignement : la description de l'expression régulière est "w".
Quelques notes : {3, 14} signifie que le modèle précédent correspond à au moins 3 mais pas plus de 14 caractères (plus le premier caractère, cela devient 4 à 15 caractères). Notez que la syntaxe entre accolades est extrêmement stricte et n'autorise pas d'espaces de chaque côté de la virgule. Si des espaces sont ajoutés, cela affectera la signification de l'expression régulière et provoquera des erreurs lors de la vérification du format du mot de passe. De plus, le caractère « $ » n'est pas ajouté à la fin de l'expression régulière ci-dessus. Le caractère $ fait correspondre l'expression régulière à la chaîne jusqu'à la fin, garantissant ainsi un mot de passe valide sans aucun caractère supplémentaire qui le suit.
Semblable à la vérification du format du mot de passe, la vérification de la légitimité des adresses e-mail est également un problème très courant. L'utilisation d'expressions régulières pour effectuer une simple vérification d'adresse e-mail peut être implémentée comme suit :
<%.
Dim ré
Définir re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"
Réponse.Écrire re.Test(" [email protected] ")
%>
2. Extraire des parties spécifiques de la page HTML
Le principal problème rencontré lors de l'extraction du contenu de la page HTML est que nous devons trouver un moyen d'identifier avec précision la partie du contenu que nous voulons. Par exemple, voici un extrait de code HTML qui affiche les titres de l'actualité :
<table border="0" width="11%" class="Somestory">
<tr>
<td largeur="100%">
<p align="center">Autre contenu...</td>
</tr>
</tableau>
<table border="0" width="11%" class="Headline">
<tr>
<td largeur="100%">
<p align="center">Guerre en Irak ! </td>
</tr>
</tableau>
<table border="0" width="11%" class="Une autre histoire">
<tr>
<td largeur="100%">
<p align="center">Autre contenu...</td>
</tr>
</table>
En observant le code ci-dessus, il est facile de voir que le titre de l'actualité est affiché par le tableau au milieu et que son attribut de classe est défini sur Headline. Si la page HTML est très complexe, vous pouvez utiliser une fonctionnalité supplémentaire fournie par Microsoft IE à partir de la version 5.0 pour afficher uniquement le code HTML de la partie sélectionnée de la page. Veuillez visiter http://www.microsoft.com/Windows/ie. /WebAccess/default.ASP En savoir plus. Pour cet exemple, nous supposons qu'il s'agit de la seule table dont l'attribut de classe est défini sur Headline. Nous devons maintenant créer une expression régulière, rechercher ce tableau de titres via l'expression régulière et inclure ce tableau dans notre propre page. La première consiste à écrire du code prenant en charge les expressions régulières :
<%
Dim ré, strHTML
Set re = new RegExp ' Créer un objet d'expression régulière
re.IgnoreCase = true
re.Global = false 'Fin de la recherche après la première correspondance
%>
Considérons maintenant la zone que nous voulons extraire : ici, ce que nous voulons extraire est l'intégralité de la structure <table>, y compris la balise de fermeture et le texte du titre de l'actualité. Par conséquent, le caractère de départ de la recherche doit être la balise de début <table> : re.Pattern = "<table.*(?=Headline)". Cette expression régulière correspond à la balise de début du tableau et peut renvoyer tout ce qui se trouve entre la balise de début et "Headline" (sauf les nouvelles lignes). Voici comment renvoyer le code HTML correspondant :
"Mettez tous les codes HTML correspondants dans la collection Matches".
Set Matches = re.Execute(strHTML)
'Afficher tous les codes HTML correspondants
Pour chaque élément des correspondances
Réponse.Écrire élément.Valeur
Suivant
'Afficher l'un des
Response.write Matches.Item(0).Value
exécute ce code pour traiter le fragment HTML présenté précédemment. L'expression régulière renvoie le contenu d'une correspondance comme suit : <table border="0" width="11%" class=". . Expression régulière Le "(?=Headline)" dans l'expression n'obtient pas les caractères, donc la valeur de l'attribut de classe de table n'est pas visible. Le code pour obtenir le reste du tableau est également assez simple : re.Pattern =. "<table.*(?=Headline) (.|n)*?</table>". Parmi eux : "*" après "(.|n)" correspond à 0 à plus de caractères et " ? " minimise la plage de correspondance "*", c'est-à-dire correspond au moins de caractères possible avant de trouver la partie suivante de l'expression </table> est la balise de fin du tableau.
Le limiteur "?" l'expression du code renvoyé pour d'autres tables. Par exemple, pour l'extrait de code HTML donné ci-dessus, si vous supprimez ce "?", le contenu renvoyé sera :
<table border="0" width="11%" class=" Titre">
<tr>
<td largeur="100%">
<p align="center">Guerre en Irak ! </td>
</tr>
</tableau>
<table border="0" width="11%" class="Une autre histoire">
<tr>
<td largeur="100%">
<p align="center">Autre contenu...</td>
</tr>
</tableau>
Le contenu renvoyé contient non seulement la balise <table> de la table Headline, mais également la table Someotherstory. On voit que le "?"
Cet exemple suppose des prémisses assez idéalistes. Dans les applications réelles, la situation est souvent beaucoup plus compliquée, surtout lorsque l'on n'a aucune influence sur l'écriture du code source HTML utilisé, l'écriture du code ASP est particulièrement difficile. La méthode la plus efficace consiste à passer plus de temps à analyser le code HTML à proximité du contenu à extraire et à tester fréquemment pour vous assurer que le contenu extrait correspond exactement à ce dont vous avez besoin. De plus, vous devez prêter attention et gérer la situation dans laquelle l'expression régulière ne peut correspondre à aucun contenu de la page HTML source. Le contenu peut changer très rapidement, alors ne vous retrouvez pas avec des erreurs ridicules sur votre page simplement parce que quelqu'un d'autre a modifié le format du contenu.
3. Analyser les fichiers de données texte
Il existe de nombreux formats et types de fichiers de données XML, le texte structuré et même le texte non structuré deviennent souvent des sources de données pour les applications ASP. Un exemple que nous examinerons ci-dessous est un fichier texte structuré utilisant des qualificatifs. Les qualificatifs (tels que les guillemets) indiquent que les parties de la chaîne sont inséparables, même si la chaîne contient des délimiteurs qui séparent l'enregistrement en champs.
Ce qui suitest
un fichier texte structuré simple :
nom, prénom, numéro de téléphone, description Sun, Wukong, 312 555 5656, ASP est très bon, Pig, Bajie, 847 555 5656, je suis producteur de films.
simple La première ligne est le titre et les deux lignes suivantes sont les enregistrements séparés par des virgules. L'analyse de ce fichier est également très simple, il suffit de diviser le fichier en lignes (en fonction des symboles de nouvelle ligne), puis de diviser chaque enregistrement en fonction des champs. Cependant, si l'on ajoute des virgules au contenu d'un certain champ :
nom, prénom, numéro de téléphone, description Sun, Wukong, 312 555 5656, j'aime ASP, VB et SQL
Pig, Bajie, 847 555 5656, je suis un producteur de films.
Il y aura un problème lors de l'analyse du premier enregistrement, car du point de vue d'un analyseur qui ne reconnaît que les délimiteurs par virgules, son dernier champ contient le contenu de deux champs. Pour éviter ce type de problème, les champs contenant des délimiteurs doivent être entourés de qualificatifs. Les guillemets simples sont un qualificatif couramment utilisé. Après avoir ajouté le qualificatif simple au fichier texte ci-dessus, son contenu est le suivant :
nom, prénom, numéro de téléphone, description Sun, Wukong, 312 555 5656, 'J'aime ASP, VB et SQL'
Zhu, Bajie, 847 555 5656, "Je suis producteur de films".
Nous pouvons maintenant déterminer quelle virgule est le délimiteur et quelle virgule est le contenu du champ, c'est-à-dire qu'il nous suffit de considérer les virgules apparaissant entre guillemets comme le contenu. du terrain. La prochaine chose que nous devons faire est d'implémenter un analyseur d'expressions régulières qui détermine quand diviser les champs en fonction des virgules et quand traiter les virgules comme le contenu du champ.
Le problème ici est légèrement différent de celui auquel sont confrontées la plupart des expressions régulières. Habituellement, nous examinons une petite partie du texte pour voir si elle correspond à une expression régulière. Mais ici, nous ne pouvons déterminer de manière fiable ce qui se trouve entre guillemets qu’après avoir examiné la ligne entière du texte.
Voici un exemple illustrant le problème. Extrayez aléatoirement une demi-ligne de contenu d'un fichier texte et obtenez : 1, plage, noir, 21, ', chien, chat, canard, ', . Dans cet exemple, comme il y a d’autres données à gauche de « 1 », il est extrêmement difficile d’analyser son contenu. Nous ne savons pas combien de guillemets simples précèdent ce fragment de données, nous ne pouvons donc pas déterminer quels caractères se trouvent entre les guillemets (le texte entre guillemets ne peut pas être divisé lors de l'analyse). Si le fragment de données est précédé d'un nombre pair (ou non) de guillemets simples, alors "', chien, chat, canard, '" est une chaîne entre guillemets et est indivisible. Si le nombre de guillemets précédents est un nombre impair, alors "1, plage, noir, 21, '" est la fin d'une chaîne et est indivisible.
Par conséquent, l'expression régulière doit analyser la ligne entière de texte, en tenant compte du nombre de guillemets qui apparaissent pour déterminer si le caractère est à l'intérieur ou à l'extérieur de la paire de guillemets, c'est-à-dire :,(?=([^']*'[ ^']*') *(?![^']*')). Cette expression régulière trouve d'abord un guillemet, puis continue la recherche et garantit que le nombre de guillemets simples après la virgule est soit un nombre pair, soit zéro. Cette expression régulière est basée sur le jugement suivant : si le nombre de guillemets simples après la virgule est pair, alors la virgule est en dehors de la chaîne. Le tableau suivant donne des instructions plus détaillées :
, recherche d'une virgule
(?= continue la recherche pour correspondre à ce modèle :
(Démarrez un nouveau modèle
[^']*' [caractères sans guillemets] 0 ou plus, suivi d'un guillemet
[^']*'[^']*) [caractères sans guillemets] 0 ou plus, suivi d'un guillemet. Combiné avec le contenu précédent, il correspond aux paires de citations
)* termine le modèle et fait correspondre l'ensemble du modèle (paires de guillemets) 0 fois ou plus
(?! Rechercher en avant, exclure ce modèle
[^']*' [caractères sans guillemets] 0 ou plus, suivi d'un guillemet
) Sous le mode de fin
se trouve une fonction VBScript, qui accepte un paramètre de chaîne, divise la chaîne en fonction du séparateur par virgule et du qualificatif de guillemet simple dans la chaîne et renvoie le tableau de résultats :
Function SplitAdv(strInput)
Dim objRE
Set objRE = new RegExp
'Définir l'objet RegExp
objRE.IgnoreCase = vrai
objRE.Global = vrai
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' La méthode Replace utilise chr(8) pour remplacer ce que nous voulons pour utiliser la virgule, chr(8) estb
', b peut apparaître extrêmement rarement dans une chaîne.
' Ensuite, nous divisons la chaîne selon b et la sauvegardons dans le tableau
SplitAdv = Split(objRE.Replace(strInput, "b"), "b")
End Function
En bref, l'utilisation d'expressions régulières pour analyser des fichiers de données texte présente les avantages d'une grande efficacité et d'un temps de développement réduit. Cela peut permettre de gagner beaucoup de temps dans l'analyse des fichiers et l'extraction de données utiles basées sur des conditions complexes. Dans un environnement en évolution rapide où de nombreuses données traditionnelles seront encore disponibles, savoir comment construire des routines d’analyse de données efficaces sera une compétence précieuse.
4. Remplacement de chaîne
Dans le dernier exemple, nous allons examiner la fonction de remplacement des expressions régulières VBScript. ASP est souvent utilisé pour formater dynamiquement du texte obtenu à partir de diverses sources de données. En utilisant la puissance des expressions régulières VBScript, ASP peut modifier dynamiquement le texte complexe correspondant. La mise en évidence de certains mots en ajoutant des balises HTML est une application courante, comme la mise en évidence de mots-clés de recherche dans les résultats de recherche.
Pour illustrer comment cela est réalisé, regardons un exemple qui met en évidence tous les « .NET » dans une chaîne. Cette chaîne peut être obtenue n'importe où, comme une base de données ou un autre site Web.
<%
Définir regEx = Nouvelle RegExp
regEx.Global = vrai
regEx.IgnoreCase = True
'modèle d'expression régulière,
'Recherchez n'importe quel mot ou URL se terminant par ".NET".
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' Chaîne utilisée pour tester la fonction de remplacement
strText = "Microsoft a créé un nouveau site Web www.ASP.NET '
Appelez la méthode Replace de l'expression régulière
."
'$1 signifie insérer le texte correspondant à la position actuelle
Response.Write regEx.Replace(strText, _
"<b style='couleur : #000099 ; taille de police : 18pt'>$1</b>")
%>
Il y a plusieurs points importants qui doivent être notés dans cet exemple. L'expression régulière entière est placée entre parenthèses et sa fonction est d'intercepter tout le contenu correspondant pour une utilisation ultérieure, qui est référencé par $1 dans le texte de remplacement. Jusqu'à 9 interceptions similaires peuvent être utilisées par substitution, référencées respectivement par 1 $ à 9 $. La méthode Replace des expressions régulières est différente de la fonction Replace de VBScript elle-même. Elle ne nécessite que deux paramètres : le texte à rechercher et le texte à remplacer.
Dans cet exemple, pour mettre en évidence les chaînes « .NET » recherchées, nous les entourons de balises en gras et d’autres attributs de style. Grâce à cette technologie de recherche et de remplacement, nous pouvons facilement ajouter la fonction de mise en évidence des mots-clés de recherche au programme de recherche du site Web, ou ajouter automatiquement des liens vers d'autres pages pour les mots-clés qui apparaissent sur la page.
Conclusion
J'espère que les différentes techniques d'expressions régulières présentées dans cet article vous ont inspiré quand et comment appliquer des expressions régulières. Bien que les exemples de cet article soient écrits en VBScript, les expressions régulières sont également utiles dans ASP.NET. Il s'agit de l'un des principaux mécanismes de validation des formulaires de contrôle côté serveur et est exportée vers l'ensemble de l'espace de noms .Text.RegularExpressions via le système. Espace de noms .Text.RegularExpressions.