question PHP preg_match
-
19-09-2019 - |
Question
Comment puis-je faire correspondre les trois mots dans la chaîne suivante avec une expression régulière compatible Perl?
word1 # $ # $ word2 mot3
Je ne sais pas les mots réels « mot1, mot2 et MOT3 » à l'avance. Je ne connais que le séparateur, qui est # $.
Et je ne peux pas utiliser la limite de mot que j'ai un codage multi-octets. Cela signifie par exemple que la chaîne peut contenir des caractères non-ASCII comme trémas qui ne sont pas détectés par le caractère de contrôle \ w.
La solution
Essayer cette expression régulière:
/(\w+)#\$(\w+)#\$(\w+)/
Modifier Après votre nous a fourni plus d'informations (voir les commentaires à cette réponse):
/((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)/
Autres conseils
#!/usr/bin/perl
use strict;
use warnings;
my $x = 'word1#$word2#$word3';
print $_, "\n" for split /#\$/, $x;
$str = explode('#$', $str);
Regex est surpuissant pour cela.
Une fonction split peut être utile même si cela dépend de ce que vous voulez faire avec la ligne.
ici est un exemple bien.
my $line = "word1#$word2#$word3"
my @words = split('#$', $line)
Cela fonctionne pour toute chaîne qui a 2 #
/([^#]+)\#\$([^#]+)\#\$([^#]+)/
/([^#]*?)#\$([^#]*?)#\$([^#]*)/