L'utilisation de la variable en tant que motif de la RegEx
Je voudrais utiliser une variable comme une expression régulière de modèle pour la mise en correspondance des noms de fichiers:
my $file = "test~";
my $regex1 = '^.+\Q~\E$';
my $regex2 = '^.+\\Q~\\E$';
print int($file =~ m/$regex1/)."\n";
print int($file =~ m/$regex2/)."\n";
print int($file =~ m/^.+\Q~\E$/)."\n";
Le résultat (ou sur ideone.com):
0
0
1
Quelqu'un peut-il m'expliquer comment je peux utiliser une variable comme une expression régulière pattern?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser
\Q
dans une seule cité /non-interpolée de la chaîne. Il doit être vu par l'analyseur lexical.De toute façon, tilde n'est pas un méta-caractère.
Ajouter
use regex "debug"
et vous verrez ce qui se passe réellement.$regex =~ s/\\Q(.*?)\\E/quotemeta($1)/ge;
pour remplacer \Q..\E. Est-il un autre moyen?\Q
\E
dans vos cordes en premier lieu.\Q
et\E
:/Comme la documentation dit:
Ainsi, l'utilisation de la
qr
devis-opérateur like.qr//
crée un objet regex, mais vous devez faire attention à ce que vous lui donnez. Si c'est un littéral, vous devez exécuter une quotemeta() sur celui-ci en premier.$RecursiveRegex
est un nom de variable et ne représente pas un appel récursif à l'expression régulière. J'ai regardé votre github le code. Je ne suis pas sûr de ce que vous faites donc, je vais juste rectifier l'erreur que vous obtenez. Vous êtes à l'aide d'un eval modificateur sur la substitution de la formes///e
. La substitution sera exécuté comme un code, le résultat étant renvoyée à l'appelant, le moteur d'expressions régulières. Pour code quelque chose enveloppé dans de la parenthèse est isolé de la part des opérateurs.\(${var}\)
. Et avec le code, il est analysé en priorité.\
est un opérateur essaie de prendre une référence à quelque chose.(
est un opérateur d'essayer de trouver, c'est la fermeture de la parenthèse)
, mais avant il le trouve, il voit\
un opérateur de référence à quelque chose. Il voit que)
n'est pas la bonne syntaxe d'une référence valide d'opérateur de séquence, de sorte qu'il s'arrête avant d'utiliser la parenthèse fermante avec unExpected operator before the backslash
. Vous recevez ce message parce que la parenthèse de l'opérateur de construire est l'actuel être analysée. Espérons que cela pourrait les aider!$str =~ s/\(a${RecursiveRegex}/"(". $RecursiveRegexSubst . ")"/gsme;
qui auront pour résultat l'emballage de votre regex chaîne entre parenthèses littéraux. C'est l'équivalent de$repl = "(". $RecursiveRegexSubst . ")"; $str =~ s/\(a${RecursiveRegex}/$repl/gsm;