Effacer les filtres
Effacer les filtres

How to use regexprep to modify strings while keeping constituent numbers intact?

12 vues (au cours des 30 derniers jours)
I have a cell array of strings:
str = {'$d(V_1)$', ...
'$d(V_2)$', ...
'$d(V_3)$'}
str = 1×3 cell array
{'$d(V_1)$'} {'$d(V_2)$'} {'$d(V_3)$'}
I wish to convert the cell array of strings into:
strDesired = {'$function(a_{d(V_1)})$', ...
'$function(a_{d(V_2)})$', ...
'$function(a_{d(V_3)})$'}
strDesired = 1×3 cell array
{'$function(a_{d(V_1)})$'} {'$function(a_{d(V_2)})$'} {'$function(a_{d(V_3)})$'}
I tried using regexprep but I do not know how to extract and put in the same number in the new string strNew as the original str. Here I'm replacing the number with x just to demonstrate my incomplete solution:
patternToFind = 'd\(V_[1-9]\)';
patternToReplaceWith = 'function\(a_\{d\(V_x\)\}\)';
strNew = regexprep(str, patternToFind, patternToReplaceWith)
strNew = 1×3 cell array
{'$function(a_{d(V_x)})$'} {'$function(a_{d(V_x)})$'} {'$function(a_{d(V_x)})$'}
Could someone assist me in forming a patternToReplaceWith which will help me arrive at strDesired after performing the regexprep?

Réponse acceptée

Voss
Voss le 10 Juin 2022
Modifié(e) : Voss le 10 Juin 2022
You can capture the V_1, V_2, etc., in tokens, then place those tokens in the output of regexprep by specifying $1 in patternToReplaceWith
str = {'$d(V_1)$', ...
'$d(V_2)$', ...
'$d(V_3)$'};
patternToFind = 'd\((V_[1-9])\)';
% ^ ^ I added parentheses here to capture tokens of the form V_[1-9]
patternToReplaceWith = 'function\(a_\{d\($1\)\}\)';
% ^^ tell regexprep to use token #1 (the only token) #1
strNew = regexprep(str, patternToFind, patternToReplaceWith)
strNew = 1×3 cell array
{'$function(a_{d(V_1)})$'} {'$function(a_{d(V_2)})$'} {'$function(a_{d(V_3)})$'}
  2 commentaires
Aryan Ritwajeet Jha
Aryan Ritwajeet Jha le 10 Juin 2022
Thank you @Voss. Those parantheses are helpful for understanding exactly what token is extracted. I too was writing my (inefficient) solution not knowing that another user had already answered it in the meantime :D
Voss
Voss le 10 Juin 2022
You're welcome! I'm glad you got it figured out. Thanks for accepting my answer anyway!

Connectez-vous pour commenter.

Plus de réponses (1)

Aryan Ritwajeet Jha
Aryan Ritwajeet Jha le 10 Juin 2022
Note: I'm answering my own question after seeing an apparent solution to my problem on MATLAB's help topic on Replace text using regular expression - MATLAB regexrep under the subheading Include Tokens in Replacement Text. I'll however wait for somene else to answer before possibly accepting this answer as I'm pretty sure there are more efficient ways to do the task.
str = {'$d(V_1)$', ...
'$d(V_2)$', ...
'$d(V_3)$'}
str = 1×3 cell array
{'$d(V_1)$'} {'$d(V_2)$'} {'$d(V_3)$'}
patternToFind = 'd\(V_(\w)\)';
Here \w looks for one word after V_ , which in the case of str is a number.
patternToReplaceWith = 'function\(a_\{d\(V_$1\)\}\)';
Here the $1 token extracts the first 'word' which was located by \w and inserts it into the replaced strings.
strNew = regexprep(str, patternToFind, patternToReplaceWith)
strNew = 1×3 cell array
{'$function(a_{d(V_1)})$'} {'$function(a_{d(V_2)})$'} {'$function(a_{d(V_3)})$'}

Catégories

En savoir plus sur Characters and Strings dans Help Center et File Exchange

Produits


Version

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by