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.

Était-ce utile?

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 #

/([^#]+)\#\$([^#]+)\#\$([^#]+)/
/([^#]*?)#\$([^#]*?)#\$([^#]*)/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top