Comment trouver ce que appariées et autres fonctionnalités avancéesParfois, tout ce dont vous avez besoin, c'est de savoir est de savoir si la saisie de texte correspond un motif. Plus couramment, vous voulez traiter ultérieurement les données spécifiques qui ont été jumelés. Par exemple, vous espérez que les données de votre formulaire Web contenant un numéro valide de carte de crédit - une séquence de 13 à 16 chiffres. Vous ne voudriez pas simplement de vérifier la présence de ce modèle; ce que vous voulez faire est d'extraire la séquence de chiffres qui a été apparié, de sorte que vous pouvez appliquer des contrôles de vérification supplémentaires. Les expressions régulières permettent de définir des groupes d'éléments de structure, un tendance générale peut, par exemple, ont peu de texte littéral, un groupe avec une séquence de caractères de longueur variable, de quelques classes, texte plus littéral, un autre groupe avec des personnages différents, et ainsi de suite. Si le motif est égalé, l'expression régulière des fonctions correspondant va stocker les détails de la reconnaissance globale et les pièces correspondent à chacun des groupes spécifiques. Ces données sont stockées dans des variables globales définies dans le noyau de Perl. Les groupes d'éléments de modèle, dont les matchs de la chaîne sont nécessaires, sont placées entre parenthèses. Ainsi, un modèle d'extraction d'un sous 13-16 chiffres chaîne depuis une chaîne plus longue pourrait être / \ D (\ d (13,16)) \ D /; si une chaîne correspond à ce modèle, la variable $ 1 tiendra le chiffre chaîne. L'exemple suivant illustre l'extraction de deux champs d'une ligne d'entrée. La ligne d'entrée est censé être un message qui contient un montant en dollars. Le montant devrait être composé d'un signe dollar, certains nombre de chiffres, un point décimal optionnel et un montant fraction facultative. Le modèle utilisé pour ce match est la suivante: / \ $ ([0-9] +) \.? ([0-9] *) \ D / Ses éléments sont les suivants: \ $ Un signe dollar littéral ([0-9] +) une séquence non vide de chiffres formant le premier groupe \.? Un point décimal optionnel ([0-9] *) une séquence optionnelle de chiffres formant deuxième groupe \ D Toute «non chiffres« caractère Le texte qui correspond au premier sous-groupe entre parenthèses se tient à la variable de base Perl $ 1; le texte correspondant du second groupe de chiffres iraient de 2 $. Puisque l'expression deuxième sous-groupe spécifie 'chiffres, de zéro ou plus », il est possible pour 2 $ pour la tenue d'une chaîne vide après un match réussi. Les variables $ 1, $ 2, etc sont en lecture seule; les valeurs des données doivent être copiées à partir de ces variables avant de pouvoir être modifié. while (1) (print "Enter string:"; $ str = Exemples d'entrées de test et les résultats sont les suivants: Entrez chaîne: This is a test of the $ programme. Ne correspondaient pas extracteur dollar Entrez chaîne: Ce programme à frais 0 $. Dollars 0 et en cents 0 Entrez chaîne: Ce programme devrait coûter 34,99 $ et 34 dollars 99 cents Entrez chaîne: QUIT
Souvent, vous avez besoin d'un motif comme: Un peu de texte fixe; Une chaîne dont la valeur est arbitraire, mais elle est nécessaire à la transformation; Certains textes fixes plus importants. Vous utilisez .* pour correspondre à une chaîne arbitraire, donc si vous cherchent à extraire les sous-chaîne entre les mots «fixe» et «texte», vous pouvez utiliser le masque / fixe (.*) text /: while (1) (print "Enter string:"; $ str = Exemple entrées et sorties: Entrez chaîne: Correction de la forme de texte sur la diapositive. Assorti avec substring jusqu'à Entrez chaîne: Fixe en place de ce texte. Commence maintenant à travailler sur un autre texte. Assorti avec sous-chaîne jusqu'à ce texte. Commence maintenant à travailler sur d'autres L'appariement de chaînes de caractères arbitraires peuvent parfois problématique. L'algorithme d'appariement est «gourmand» -, il tente de trouver la plus longue série qui correspond. Il existe des contrôles plus subtils, vous pouvez utiliser des caractères comme le .*? qui correspondent à une chaîne de caractères minimal (ainsi dans la deuxième des exemples ci-dessus, vous obtiendrez le match «jusqu'à présent»). Parfois, il ya un besoin de modèles plus complexes comme: fixed_text (somepattern) other_stuffSAMEPATTERNrest_of_line Ces modèles peuvent être définis grâce à l'utilisation de "références arrière» dans la chaîne de modèle. Références Retour sont liés à la sous-matched strings.When la matcher pattern est la vérification du modèle, elle trouve une correspondance possible pour la première sous-chaîne (la élément «(somepattern) 'dans l'exemple) et enregistre ce texte dans la variable de base Perl $ 1. Une référence arrière, sous la forme \ 1, qui survient plus tard dans le schéma match sera remplacé dynamiquement par cette correspondance partielle sauvé. Le comparateur de prix peut alors confirmer que le même schéma se répète. Références Retour sont illustrés dans les fragments de code suivant. Ces fragments pourraient constituer une partie d'un script Perl qui a consisté à réaliser une traduction approximative de code de Pascal en code C. Une telle transformation ne peut être complètement automatisé (les langues ne possèdent quelques différences fondamentales, comme la capacité de Pascal à nid déclarations de procédure), mais une grande partie de la tâche de traduction peut être automatisé. Plus simple les opérations de transformation que vous voulez sont les suivants: Count: = count + 1; => count + +; Count: = Count * Mul; => Count *= Mul, Sum: = Sum + 17; => somme + = 17; Pour ces derniers, vous avez besoin d'un modèle qui: Correspond à un nom (lvalue), ce qui devra être complété sous-chaîne $ 1. Matches de Pascal: = opérateur d'affectation. Correspond à un autre nom qui est identique à la première chose appariés, il vous faut donc la référence au verso \ 1 dans le motif. Correspond à un Pascal +, -, *, / opérateur, ce qui devra être complété sous-chaîne 2 $. Correspond à un nombre ou un autre nom; sous-chaîne correspondant à 3 $. Matches de Pascal clôturant ';'. Permet d'espace de plus nulle part. Si une ligne d'entrée correspond au modèle, le programme peut aller à la ligne révisée qui utilise C de la modification des opérateurs d'affectation (+ +, + =, etc) et les entrées qui ne correspondent pas être mai production inchangée. Un cadre petit test qui illustre les transformations que pour les '+' et '-' des opérateurs est la suivante: while (1) (print "Enter string:"; $ str = Le modèle ici est nécessaire: / \ s * ([A-Za-z] \ w *) *: * = \ 1 * (\ + | \ * | \ / | -) * (([0-9 ]+)|([ A - Za-z] \ w *)) *; /) Les pièces sont: s * correspond à un nombre quelconque de l'espace de tête ou des caractères de tabulation. ([A-Za-z] \ w *) correspondent à une chaîne qui commence par une lettre, a donc un nombre arbitraire de lettres, chiffres et caractères de soulignement (devrait capturer les identifiants valides variable Pascal). Cela va de pair sous-groupe 1 $, sa valeur sera référencé plus loin dans la configuration via le renvoi \ 1. Sa valeur peut être utilisée dans le code de traitement. '*' Un espace avec un quantificateur * (zéro ou plus), ce qui correspond à tous les espaces qui apparaissent après le nom de variable et avant l'opérateur d'affectation Pascal: =. : = La chaîne littérale qui correspond à l'opérateur d'affectation de Pascal. '*' De plus, prévoir des espaces supplémentaires. \ 1, le motif de référence arrière. Nécessaires pour établir qu'elle travaille sur des formes comme somme: = somme + val;. '*' La disposition habituelle des espaces supplémentaires. (\ + | \ * \ \ / | -) Correspondent à un opérateur binaire Pascal. (Caractères comme '+' doivent être «échappé» parce que leur interprétation normale est que des éléments de contrôle dans la définition du pattern.) '*' Espaces possibles. (([0-9 ]+)|([ A-Za-z] \ w *)) une sous-chaîne trouvée qui est soit une séquence de chiffres - [0-9] + - ou un nom de variable Pascal. '*' Comme d'habitude, les espaces. ; Expressions Pascal séparateur de déclaration ordinaire pour des filtrages complexes peuvent devenir assez grands. J'ai entendu dire, par courriel, des rumeurs d'une expression de 4000 caractères qui capture les éléments importants de l'adresse e-mail, prise en compte pour la majorité des variations de la forme des adresses e-mail! Élaborer des programmes de ce texte ne se transforme, comme une version plus ambitieuse du jouet 'Pascal convertisseur C', habituellement, doivent appliquer plusieurs transformations différentes pour la même ligne d'entrée. Par exemple, un Pascal, si ... doit ensuite être réécrit en C si (...)...'s style. Si le conditionnel de cette déclaration implique un opérateur NOT Pascal, il doit être réécrit en C's! opérateur. Ces programmes de transformation ne sont pas simplement lire une ligne, appliquer une transformation et la production de la ligne transformée. Au lieu de cela, ils sont appliqués successivement à la chaîne in situ. Après chaque transformation, la chaîne mise à jour est comparé à d'autres modèles possibles et de leurs remplaçants. Perl dispose d'un opérateur de substitution qui exécute ces transforme in situ de chaînes. Un modèle de substitution se compose d'une expression régulière qui définit les caractéristiques dans la chaîne source et le texte de remplacement. Les patrons et les remplacements peuvent intégrer égalés sous-chaînes, de sorte qu'il est possible d'extraire un morceau variable de textes intégrés dans un certain contexte fixe et définir un remplacement dans le texte variable, qui est incorporé dans un contexte quelque peu changé. L'imaginaire 'Pascal à C transformateur »fournit un autre exemple. On aurait besoin de changer de Pascal n'est pas exploitant à C's! opérateur. Les cas les plus courants, ce qui serait facile à traduire, sont les suivants: Lvalue: = pas d'expression; =>! Lvalue = expression; si (non expression) alors => if (! Expression) puis L'instruction if devra être soumis à la transforme en outre de remplacer le if ... then forme par le C équivalent construire. Un modèle de substitution qui pourraient rendre ces transformations est la suivante: /(:=| s \ () * pas + / \ 1! /; Le modèle définit: Un sous-groupe que l'une d'elle contient la séquence littérale: = ou une parenthèse gauche (échappé en tant que \ (). Facultatif espaces. Le littéral pas. Un ou plusieurs espaces. Le remplacement est le texte qui correspond au sous-groupe (soit: = ou une parenthèse à gauche), un espace et C's! opérateur. Ce modèle de substitution serait utilisée dans le code suivant: while ($ str = ) (Chomp ($ str); # apply séquence d'transforme à $ str ... # prochain, face non exploitant de Pascal $ str = ~ s /(:=| \ () * pas + / \ 1 '/;. .. print $ str, "\ n";) Votre première application d'expressions régulières utilisera seulement les formes les plus simples de modèles. Vos tâches seront, après tout, être des choses simples comme l'extraction d'un montant de quelque texte de saisie, l'isolement d'une adresse IP d'un serveur de log, ou d'identifier quelle compagnie de carte de crédit est préférable. Mais il est possible, et il est souvent utile pour juger plus sophistiqués les allumettes et les transforme. Vous pouvez obtenir de nombreuses idées de l'perlretut tutoriel Perl perlre documentation de référence. un article présenté par Andrew Peterson Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite. Important: Cet article «Comment trouver ce que appariées et autres fonctions avancées" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.
|
|||||
| Online: 315 users browsing the articles directory |
|
|