replacing a string with another and vice versa

1 visualización (últimos 30 días)
Patrick Mboma
Patrick Mboma el 3 de Oct. de 2012
Hi, I would like to write two functions:
1- replace all occurrences of 'a(number)' and 'bb(number)' with respectively 'a_number' and 'bb_number'. More concretely, a(1) would become a_1 and bb(1285) would become bb_1285. the typical string would look like
string='log(a(2))+a(3)*cosh(exp(bb(5))'
and the result would be
string='log(a_2)+a_3*cos(exp(bb_5))'
2- do the inverse operation
Is there any efficient way of doing this? My sense is that it can be done with regular expressions but I am just a beginner on that front and I would not know how to go about this. Your help will be appreciated.
thanks,
Pat.
  3 comentarios
Patrick Mboma
Patrick Mboma el 3 de Oct. de 2012
Editada: Patrick Mboma el 3 de Oct. de 2012
I tried '(a|bb)\(d*\)' but it did not work.
Daniel Shub
Daniel Shub el 3 de Oct. de 2012
You forgot to escape the "d"

Iniciar sesión para comentar.

Respuesta aceptada

Matt Fig
Matt Fig el 3 de Oct. de 2012
Editada: Matt Fig el 3 de Oct. de 2012
str = 'log(a(2))+a(3)*cosh(exp(bb(5)))'; % Initial string
str = regexprep(str,'(bb)\((\d)\)|(a)\((\d)\)','$1_$2')
  4 comentarios
Patrick Mboma
Patrick Mboma el 3 de Oct. de 2012
Millions thanks Matt!
I also figured out it is possible to simplify things even further by writing
str2 = regexprep(str,'(bb|a)\((\d)\)','$1_$2')
then one can also do the inverse operation
str3 = regexprep(str2,'(bb|a)(\_)(\d)','$1($2)')
Matt Fig
Matt Fig el 3 de Oct. de 2012
Indeed!

Iniciar sesión para comentar.

Más respuestas (1)

per isakson
per isakson el 3 de Oct. de 2012
Editada: per isakson el 4 de Oct. de 2012
A start of one way to use regular expression:
string = regexprep( string, '(?<=a)\((\d+)\)', '_$1' );
string = regexprep( string, '(?<=bb)\((\d+)\)', '_$1' );
.
-- in one line ---
Look for "(one or more digits)" that comes directly after "bb" or "a"
>> string = regexprep( string, '(?<=((bb)|a))\((\d+)\)', '_$1' )
string =
log(a_2)+a_3*cosh(exp(bb_5)
  • (?<=((bb)|a)) "Look behind from current position and test if expr is found." Where expr evaluate to "a" or "bb".
--- another one-liner ---
>> str = log(a(2))+a(3)*cosh(exp(bb(5));
>> regexprep( str, '((bb)|a)\((\d+)\)', '$1_$2' )
ans =
log(a_2)+a_3*cosh(exp(bb_5)
  • (bb)|a stands for "bb" or "a"
  • (expr) stands for group regular expressions and capture tokens
  • *\(* stands for "("
  • \d+ stands for one ore more digits
  3 comentarios
per isakson
per isakson el 3 de Oct. de 2012
Editada: per isakson el 3 de Oct. de 2012
Yes it is, but why bother? Matt, has done it. With regular expressions one must not make it more complicated than one master.
per isakson
per isakson el 4 de Oct. de 2012
See above

Iniciar sesión para comentar.

Categorías

Más información sobre Characters and Strings en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by