2017-09-27 2 views
0

Je suis en train d'avoir une fonction qui remplace plusieurs occurrences de oripart-newpart dans la chaîne envoyé:plusieurs occurrences de sous-chaîne dans le langage Red

strReplace: func [str [string!] oripart [string!] newpart [string!]][ 
     if find str oripart [ 
      change find str oripart newpart 
      strReplace str oripart newpart ] ; recursion to change more occurrences; 
     str ] 

print strReplace "this is a short line" "short" "small" 
print strReplace "this is a short line" "this" "THIS" 
print strReplace "this is a short line" "line" "LINE" 
print strReplace "this is a long line" "short" "small" 
print strReplace "this is a short short line" "short" "small" 

J'utilise la récursivité pour supprimer plusieurs occurrences. Cela fonctionne bien pour une seule ligne de test. Cependant, il produit un débordement de pile si je teste le code ci-dessus. Où est le problème?

Répondre

3

Pourquoi ne pas utiliser simplement remplacer ou REMPLACER/tous

replace/all oristr oripart newpart

Votre souffle d'essai parce que vous changez par exemple "this" à "CE" et Rouge même que Rebol est la plupart du temps insensible à la casse, si vous ne demandez pas explicitement strict ou cas. Donc, il est récurrent et récursif.

>> "this" = "THIS" 
== true 
>> "this" == "THIS" 
== false 
>> find "this" "THIS" 
== "this" 

Si vous voulez vraiment utiliser votre propre strReplace vous devez utiliser find/cas

>> find/case "this" "THIS" 
== none 

Il y a une solution plus à votre problème; recurse à une position après le changement comme dans

strReplace: func [ 
     str [string!] oripart [string!] newpart [string!] 
    ][ 
     if find str oripart [ 
      str: change find str oripart newpart 
      strReplace str oripart newpart ; recursion to change more occurrences; 
     ] 
     head str 
    ] 
+0

Oui, trouver/cas était le vrai problème. – rnso

+0

Utilisez ** replace/all ** à la place, car il remplace toutes les occurrences – sqlab