complex string match with regexprep

What should be the expression in the following script to generate out from str?
str='diff([v0(k-1,2)-v0(k-1,1) v(2)-v(1)])/diff(t0(k-1:k))+((v(2)-0)*diff(t0(k-1:k))+sum((v0(2:k-1,2)-v0(2:k-1,10)).*diff(t0(1:k-1)).'',1))';
expression = ???;
replace = '0';
out=regexprep(str,expression,replace);
out='diff([v0(k-1,2)-v0(k-1,1) v(2)-v(1)])/diff(t0(k-1:k))+((v(2)-0)*diff(t0(k-1:k))+sum((v0(2:k-1,2)-0).*diff(t0(1:k-1)).'',1))'

7 comentarios

Adam Danz
Adam Danz el 14 de Mayo de 2019
It would be helpful for you to explicitly show us the the differences between str and out so we can be sure there weren't typos and so we can be certain of the pattern you want to extract.
S H
S H el 14 de Mayo de 2019
Editada: S H el 14 de Mayo de 2019
I want to learn how to match complex strings such as
v0(2:k-1,10)
using regexprep. In my question posted here, I want to learn how to change
'v0(2:k-1,10)'
with another string such as
'0'
Adam Danz
Adam Danz el 14 de Mayo de 2019
Editada: Adam Danz el 14 de Mayo de 2019
For the string 'v0(2:k-1,10))' what parts of it might vary and what parts will always be the same. For example, will it always have any of these structures?
  • v0(#:k-#,#)
  • v0(#:_-_,#)
  • v0(#:_,#)
  • v0(#:_,_)
  • v0(_:_,_)
  • _(_:_,_)
  • _(_,_)
The more specific (higher up on my list), the better.
I'm assuming the string won't always be identical to 'v0(2:k-1,10)'
S H
S H el 14 de Mayo de 2019
Editada: S H el 14 de Mayo de 2019
The question marks ? can change in the string and can have different length and patterns:
'v0(??????,10)'
The first unchanging part of the string I want to change is
v0(
and the last unchanging part of the string is
,10)
Adam Danz
Adam Danz el 14 de Mayo de 2019
Got it. Thoroughly test my answer and if there are any problems, you can leave a comment under my answer and we can continue the discussion.
S H
S H el 14 de Mayo de 2019
I tested your answer on my lengthy strings and it works as expected. Thank you for teaching me the use of [^,]* in regexprep. I was reading Matlab regexp help page a few times and such an important and helpful combination as [^,]* is not clearly explained there.
Adam Danz
Adam Danz el 14 de Mayo de 2019
There are so many options with regular expressions that it's hard to capture them all in one document. I usually just google awkward phrases like "regular expressions match any character until" to remind myself of the options. The website I suggested in my answer is another great tool.

Iniciar sesión para comentar.

 Respuesta aceptada

Adam Danz
Adam Danz el 14 de Mayo de 2019
Editada: Adam Danz el 14 de Mayo de 2019
Here you are.
str='diff([v0(k-1,2)-v0(k-1,1) v(2)-v(1)])/diff(t0(k-1:k))+((v(2)-0)*diff(t0(k-1:k))+sum((v0(2:k-1,2)-v0(2:k-1,10)).*diff(t0(1:k-1)).'',1))';
expression = 'v0\([^,]+,10\)';
replace = '0';
out = regexprep(str, expression, replace)
Compare input/output (I added space in output for comparison)
diff([v0(k-1,2)-v0(k-1,1) v(2)-v(1)])/diff(t0(k-1:k))+((v(2)-0)*diff(t0(k-1:k))+sum((v0(2:k-1,2)-v0(2:k-1,10)).*diff(t0(1:k-1)).',1)) %input
diff([v0(k-1,2)-v0(k-1,1) v(2)-v(1)])/diff(t0(k-1:k))+((v(2)-0)*diff(t0(k-1:k))+sum((v0(2:k-1,2)-0 ).*diff(t0(1:k-1)).',1)) %output

2 comentarios

S H
S H el 14 de Mayo de 2019
It works nicely. Thank you very much.
Adam Danz
Adam Danz el 14 de Mayo de 2019
Editada: Adam Danz el 14 de Mayo de 2019
Great! Just so you know...
  • v0\( Start the expression at v0(
  • [^,]+ Stop matching just before the next comma
  • ,10\) make sure the expression ends with ,10)
A nice workstation to develop regular expressions: https://regex101.com/

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Characters and Strings en Centro de ayuda y File Exchange.

Preguntada:

S H
el 14 de Mayo de 2019

Comentada:

el 14 de Mayo de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by