2017-09-21 4 views
1

Je travaille sur un script LUA destiné à bloquer toutes les lignes contenant la chaîne "@ 7.7.7.7" dans n'importe quelle partie des données entrantes. Pour cela l'expression rationnelle suivante a été utilisée:La correspondance de modèle LUA ne fonctionne pas comme prévu

local reg = regex.new("555d%|@7\.7\.7\.7\\b\|abc.com") 

Bien que cela ne bloque @ 7.7.7.7, il bloque aussi @ 757.787.84.91 Je fait des recherches sur le langage de programmation Lua et il a montré que% (et non) est le caractère d'échappement pour le personnage magique. (point) Par conséquent, dans le modèle "555d% | @ 7.7.7.7 \ b |", \ n'a aucun effet et. est pris pour correspondre à n'importe quel personnage. Cependant étrangement, quand je remplace \ par%, il ne bloque pas une ligne contenant "@ 7.7.7.7". Le nouveau modèle est la suivante:

local reg = regex.new("555d%|@7%.7%.7%.7\\b|") 

Quelqu'un pourrait-il me aider à savoir ce qui pourrait être la raison?

+0

Quelle bibliothèque utilisez-vous? Si vous voulez utiliser les patterns Lua, '@ 7.7.7.7' peut être associé à' @ 7% .7% .7% .7% f [% D] '. Si c'est [Iceberg avec * Oniguruma * regex] (https://github.com/yuin/iceberg/blob/master/src/ib_regex.h), vous avez besoin de "555d% \\ | @ 7 \\. 7 \\. 7 \\. 7 \\ | "' (si '|' sont des symboles littéraux). –

+0

Merci d'avoir répondu. En fait ce sont des scripts pré-écrits et c'est mon premier pinceau avec Lua. Par conséquent, je ne suis pas sûr de savoir quelle bibliothèque est utilisée bien que je pense qu'elle soit basée sur PCRE. – vchandra

+0

Quelle est votre réelle contribution? Je veux dire, quelle est la chaîne littérale exacte dont vous avez besoin pour * correspondre *? Notez que '[[]]]' dans Lua sont comme les littéraux de chaînes brutes dans Python, le '' \ '' n'est pas traité comme un char de séquence d'échappement. Est-ce que la réponse de moteus fonctionne pour vous? Alors acceptez-le. –

Répondre

1

Votre premier problème parce que la séquence \. est en train d'échapper char. Sur Lua 5.1 est égal à . mais pas de Lua> 5.1 et sur LuaJIT il produit une erreur comme invalid escape sequence near '\.'. Donc "555d%|@7\.7\.7\.7\\b|" égal à "555d%|@7.7.7.7\\b|". Et ce modèle (supposons que PCRE est compatible) correspond à @757.787 Suivant. Le dernier caractère de pipe dans le motif permet de faire correspondre la chaîne vide. Donc presque chaque chaîne correspond à ce modèle. Également d% dans PCRE égal à d%. Je pense que vous avez besoin comme modèle

local reg = regex.new([[555d%|@7\.7\.7\.7\b]]") 
-- or if you need pipe as last char in string 
local reg = regex.new([[555d%|@7\.7\.7\.7\b\|]]") 

Ce qui signifie correspondance à 555d% ou @7.7.7.7

+0

Merci pour votre réponse. Le dernier tuyau a été incorrectement inséré. Cependant, je suis un peu confus ici. Voulez-vous dire que lorsqu'il est mis à l'intérieur de la chaîne '\' n'aura aucun effet mais entre parenthèses cela fonctionnera comme un caractère d'échappement. Le seul changement que je vois est de remplacer les guillemets par des crochets. – vchandra

+0

vous pouvez espérer '\' chars comme '" 555d% | @ 7 \\. 7 \\. 7 \\. 7 \\ b "' – moteus

+0

Cela fonctionne. Merci beaucoup pour votre aide. – vchandra