5 votes

Perl diviser et expression régulière

J'ai la chaîne suivante :

'100% California Grown Olives, Water, Salt And Ferrous Gluconate (An,Iron, Derivative),asasd, sadasda'

Je tente de la diviser par /,/ mais seulement si ce n'est pas entre crochets, par exemple, dans ce cas le résultat devrait être :

100% California Grown Olives
Water
Salt And Ferrous Gluconate (An,Iron, Derivative)
asasd
sadasda

merci,

12voto

Tim Pietzcker Points 146308
@result = split(m/,(?![^()]*\))/, $subject);

Cela divise sur une virgule seulement si la parenthèse suivante (le cas échéant) n'est pas une parenthèse de fermeture. Comme l'a noté Jack Maney correctement, cela peut entraîner un échec si des parenthèses imbriquées peuvent survenir.

Explication :

,       # Correspond à une virgule.
(?!     # Vérifie qu'il est impossible de faire correspondre...
 [^()]* # n'importe quel nombre de caractères autres que des parenthèses
 \)     # suivi d'une parenthèse fermante
)       # Fin de la vérification anticipée

1voto

Eric Strom Points 30894

Tout d'abord, vous devez décider ce qui constitue des parenthèses et s'ils peuvent être imbriqués. (pour cette réponse, je vais supposer qu'ils le peuvent). Ensuite, vous devez supprimer ces blocs de parenthèses du texte et les remplacer par un espace réservé :

my @parens;
$str =~ s/( \( (?: (?0)|[^()] )* \) )/push @parens, $1; "PARENS_$#parens"/gex;

Maintenant, il vous reste quelque chose qui ressemble à :

'100% California Grown Olives, Water, Salt And Ferrous Gluconate PAREN_0,asasd,
sadasdas.'

Et il est maintenant facile de le diviser en virgules. Ensuite, sur chacun des éléments divisés, recherchez les jetons PAREN_\d+, et remplacez-les par ceux du tableau @parens. Vous devrez peut-être utiliser un nom de espace réservé plus unique en fonction de votre contenu source.

Quelque chose comme :

s/PARENS_(\d+)/$parens[$1]/ge for my @segs = split /,\s*/ => $str;

say for @segs;

qui, pour une chaîne d'exemple :

my $str = "foo (b,a,r), baz (foo, (bar), baz), biz";

affiche :

foo (b,a,r)
baz (foo, (bar), baz)
biz

0voto

Neil Points 24938

Il est peut-être plus facile de construire une expression régulière pour ce que vous voulez trouver, plutôt que ce que vous voulez supprimer. (Cela suppose que vous ne voulez pas limiter le nombre de correspondances.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X