2017-07-25 1 views
0

Dans une chaîne multi-ligne comme ceci:RegEx: rechercher et remplacer EOL entre guillemets

She Loves You [Mono],"Past Masters, Vol. 1",4,"She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah, yeah" 
Eight Days A Week,Beatles For Sale,8,"Eight days a week 
I love you. 
Eight days a week 
Is not enough to show I care." 

Je veux remplacer EOL (\ r \ n) entre les guillemets avec un caractère de remplacement comme « ¶ "(Code ASCII 182) pour faire de cette chaîne une seule ligne.

Le résultat serait:

She Loves You [Mono],"Past Masters, Vol. 1",4,"She loves you, yeah, yeah, yeah¶She loves you, yeah, yeah, yeah¶She loves you, yeah, yeah, yeah, yeah" 
Eight Days A Week,Beatles For Sale,8,"Eight days a week¶I love you.¶Eight days a week¶Is not enough to show I care." 

J'ai essayé diverses solutions liées RegEx trouvées sur StackOverflow mais je ne pouvais pas les adapter à ce que je veux.

Je vais utiliser cette expression RegEx dans la fonction AHK:

RegExReplace(Haystack, NeedleRegEx [, Replacement = "", OutputVarCount = "", Limit = -1, StartingPosition = 1]) 

RegExReplace(MyText, NeedleRegEx???, "¶") 

Toute aide appréciée.

+0

Non, il ne va pas le réparer. Le défi est de faire le remplacement seulement entre les citations. – JnLlnd

+0

Je vais clarifier ma question à ce sujet. – JnLlnd

+0

Ma question n'était pas assez claire. J'ai mentionné l'exigence «entre guillemets» seulement dans le titre et je n'ai pas repris la question elle-même. Désolé pour ça. S'il vous plaît voir la question éditée. – JnLlnd

Répondre

0

Vous pouvez analyser la chaîne et opérer de cette façon peut-être?

str = 
(
She Loves You [Mono],"Past Masters, Vol. 1",4,"She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah, yeah" 
Eight Days A Week,Beatles For Sale,8,"Eight days a week 
I love you. 
Eight days a week 
Is not enough to show I care." 
) 
outStr := "" 
Loop, Parse, str, `" 
{ 
    field := A_LoopField 
    StringReplace, field, field, `r,, All 
    StringReplace, field, field, `n, ¶, All 
    outStr .= field 
} 
MsgBox % outStr 
ExitApp 
+0

Je ne cherche pas un "simple remplacement". Le défi est de faire le remplacement seulement entre les citations, pas toutes comme votre solution simple ferait l'affaire. – JnLlnd

+0

Je vais clarifier ma question à ce sujet. – JnLlnd

+0

Vous devrez analyser la chaîne. J'ai modifié ma réponse. – fischgeek

0

Comme il semble qu'il n'y a pas de solution à l'aide RegEx seulement, je poste ici une solution écrite par maestrith (sur AHK Forum). Il remplace l'EOL entre guillemets, gardant les guillemets encapsulés. Il lit et traite tout le contenu en utilisant StrSplit pour isoler les sections entre guillemets, en les traitant avec une combinaison de RegExReplace et StringReplace. Je dois encore le tester sur un très gros fichier pour voir comment il fonctionne par rapport à un autre script que j'ai écrit qui traite le contenu un char à la fois.

#SingleInstance,Force 
info= 
(
She Loves You [Mono],"Past Masters, Vol. 1",4,"She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah, yeah" 
Eight Days A Week,Beatles For Sale,8,"Eight days a week 
I love you. 
Eight days a week 
Is not enough to show I care." 
) 
for a,b in StrSplit(info,Chr(34)){ 
    if(!Mod(A_Index,2)){ 
     replace:=RegExReplace(b,"\R",chr(182)) 
     StringReplace,info,info,%b%,%Replace% 
    } 
} 
Gui,Font,s10 
Gui,Add,Edit,w1000 h200 -Wrap,%Info% 
Gui,Show 
0

Je vais ajouter ceci comme réponse même si elle ne répond pas à ma question initiale. Cela n'utilise pas RegEx mais, à la fin, est plus rapide que la tentative dans la réponse précédente (environ 3x à 5x plus rapide sur un fichier csv de 3 megs).

#SingleInstance,Force 
info= 
(
She Loves You [Mono],"Past Masters, Vol. 1",4,"She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah 
She loves you, yeah, yeah, yeah, yeah" 
Eight Days A Week,Beatles For Sale,8,"Eight days a week 
I love you. 
Eight days a week 
Is not enough to show I care." 
) 
blnInsideEncapsulators := false 
Loop, Parse, info 
    ; parsing on a temporary copy of info - so we can update the original info inside the loop 
{ 
    if (A_Index = 1) 
     info := "" 
    if (blnInsideEncapsulators AND A_Loopfield = "`n") 
     info := info . Chr(182) 
    else 
     info := info . A_Loopfield 
    if (A_Loopfield = """") 
     blnInsideEncapsulators := !blnInsideEncapsulators ; beginning or end of encapsulated text 
} 
Gui,Font,s10 
Gui,Add,Edit,w1000 h200 -Wrap,%Info% 
Gui,Show 

Je laisserai cette discussion sans réponse acceptée dans le cas où quelqu'un aurait une solution complète de RegEx. Ne sait jamais ...

Merci à tous pour votre contribution.