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

10 次查看(过去 30 天)
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?

采纳的回答

Voss
Voss 2022-6-10
编辑:Voss 2022-6-10
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 个评论
Aryan Ritwajeet Jha
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

请先登录,再进行评论。

更多回答(1 个)

Aryan Ritwajeet Jha
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)})$'}

类别

Help CenterFile Exchange 中查找有关 Characters and Strings 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by