2
votes

Expression régulière pour supprimer les espaces au milieu d'une chaîne avant un caractère

J'essaye de capturer le "Some Company Name" à partir de la chaîne ci-dessous

(\@\@VALUE=)(\s)([^@]*)

Mais sans les espaces de fin avant le @@ final.

Je suis recevant ces données comme un tube, j'essaie donc d'utiliser un remplacement regex en Perl pour remplacer cette partie, donc le résultat final ressemblerait à:

"Some Company Name            "

Je peux faire correspondre le début espace avant le nom de l'entreprise, mais ma correspondance pour le nom de l'entreprise est toujours:

@@VALUE=Some Company Name@@

En utilisant actuellement cette expression régulière:

@@VALUE= Some Company Name            @@

Supprimer l'espace blanc de fin serait facile sans le @@ à la fin.


8 commentaires

\ @ \ @ CLIENT = \ s * (. +?) \ s * \ @ \ @


Pourquoi votre expression régulière contient-elle "@@ CUSTOMER =" , alors que vos exemples d'entrées contiennent "@@ VALUE = ? Veuillez modifier pour clarifier.


@Matthew Cela semble avoir des performances terribles s'il y avait une longue chaîne sans @@ à la fin.


@Matthew - cela a parfaitement fonctionné. Je prenais complètement la mauvaise approche.


@Matthew J'ai testé votre expression régulière avec la chaîne '@@ CUSTOMER = hello? ». ('' x 50000). "\ nX \ @ \ @" . Il a fallu plusieurs secondes pour terminer (et échouer), consommant 100% de CPU. C'est assez mauvais.


@melpomene merci pour la perspicacité, j'utilise très rarement regex pour tout ce qui est essentiel aux performances personnellement, mais il est bon de connaître ses limites. Bien sûr, si OP a un tel scénario, il serait souhaitable de choisir une autre solution.


@Matthew Ce n'est pas une limitation inhérente aux expressions rationnelles. Utilisez simplement un schéma non stupide ^ W moins horrible.


Montre-moi où la regex t'a touché


3 Réponses :


1
votes

Si vous essayez de supprimer tous les espaces avant le @@ final, c'est juste

s/\s+\@\@$/\@\@/;

Je ne sais pas pourquoi vous devez faire correspondre autre chose .


0 commentaires

0
votes

Essayez Regex: \s+(?=@@$)

Démo Regex

Démo Perl


0 commentaires

0
votes

ou utilisez le mode paresseux de regex perl

$s = '@@VALUE= Some Company Name       @@'
$s =~ s/@@VALUE=\s*(.+?)\s*@@\s*$/$1/
print $s


0 commentaires