2009-07-24 6 views
0

Comment puis-je faire correspondre les trois mots de la chaîne suivante avec une expression régulière compatible Perl?PHP preg_match question

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 le mot boundary car j'ai un codage multi-octets. Cela signifie par exemple que la chaîne peut contenir des caractères non ASCII comme des trémas qui ne sont pas détectés par le caractère de contrôle \ w.

+4

Qu'en est-il de la scission? – Dario

+0

Utilisez-vous Perl ou un autre langage qui prétend avoir des expressions régulières Perl? –

+0

J'utilise PHP preg_match – prinzdezibel

Répondre

2

Essayez cette expression régulière:

/(\w+)#\$(\w+)#\$(\w+)/ 

Modifier Après votre nous a fourni plus d'informations (voir les commentaires à cette réponse):

/((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)/ 
+0

Impossible d'utiliser la limite de mot comme le mot pourrait être pratiquement tout ce qui ne comprend pas les deux caractères consécutifs # – prinzdezibel

1
#!/usr/bin/perl 

use strict; 
use warnings; 

my $x = 'word1#$word2#$word3'; 
print $_, "\n" for split /#\$/, $x; 
+0

Je suppose qu'il pose des questions sur l'expression régulière – joe

+0

@Kirsh le bon outil Perl à utiliser ici est 'split' –

+0

I besoin d'une expression régulière ici car cela sert de sous-expression seulement. – prinzdezibel

0

Cette volonté travailler pour toute chaîne qui a 2 #

/([^#]+)\#\$([^#]+)\#\$([^#]+)/ 
+0

Cela ne fonctionne pas car il correspond également au signe dollar. – prinzdezibel

-2
/([^#]*?)#\$([^#]*?)#\$([^#]*)/ 
+2

Cela ne fonctionne pas pour wor # d1 # $ word2 # $ word3 ce qui serait valide puisque le séparateur est toujours un caractère de hachage suivant un caractère dollar – prinzdezibel

+0

Serait utile d'expliquer ce que fait cette regex au lieu de simplement le laisser ici non documenté. – Kev

0

Une fonction split peut être utile même si cela dépend de ce que vous voulez faire avec la ligne.

voici cependant un exemple.

my $line = "word1#$word2#$word3" 
my @words = split('#$', $line) 
1
$str = explode('#$', $str); 

Regex est surpuissant pour cela.