From: per isakson on
"lily " <mediocrity111(a)hotmail.com> wrote in message <i0ou2s$p29$1(a)fred.mathworks.com>...
> "per isakson" <poi.nospam(a)bimDOTkthDOT.se> wrote in message <i0nmb3$gen$1(a)fred.mathworks.com>...
> > "lily " <mediocrity111(a)hotmail.com> wrote in message <i0n14d$ecp$1(a)fred.mathworks.com>...
> > > My question is how to use function regexprep to replace a whole string with a part of it.
> > > K>> str='a_b_c.3d.6';regexprep(str,'\w?_(\w+)_\w+?','$1')
> > > ans =
> > > b.3d.6
> > > What I want is only &#8216;b&#8217;,how to define the pattern?Thanks.
> >
> > >> str='a_b_c.3d.6';regexprep(str,'\w?_(\w+)_.+','$1')
> > ans =
> > b
> > >>
> >
> > I guess \w doesn't match "."
> >
> > / per
>
> Thanks per, but the above string is just an example,I mean, if the whole string contents I don't know,maybe it contains '.' ':' '/' '|' or something else, then how to define the general pattern expression string?
>
> Another question:
> InVars=who('-regexp',[Var,'_',Mode,'_\w+']);
> then I get the variables a_b_c.3d.5 and p_a_b_c.3d.5,but what I want is just the first one, the variables beginning with string 'a', why MATLAB gives the second one in the meanwhile?

IMO (if you intend to use your code for more than the next few days):
1. It is difficult to make robust constructs with regular expressions. There is always cases you didn't think of. When you intend to match the full string surrounding the expression with "^" and "$" it makes the more robust.
2. Constructs with regular expressions are difficult (or worse) to understand. You need to write detailed and correct comments to non-trivial constructs. You will need to fix a problem in a week from now.
3. Writing comments helps getting the construct to work correctly. What is "\w+?" at the end of your expression supposed to mean? BTW: what is the leading "\w?_" intended to match?
4. When reading the documentation you need to make experiments with your own code. Did you notice that my construct allows the characters "'.' ':' '/' '|'" after "b_"?
5. When you made the code work sped an extra 20% time to clean up the code - make it simpler (refactor the code). It pays off the next time you need to work with it.

I don't understand what exactly you want to achieve with "InVars=who(..."

/ per

>> str='a_b_c|.3d.6';regexprep(str,'\w?_(\w+)_.+','$1')
ans =
b
>> str='a_b_c|3d.6';regexprep(str,'^\w?_(\w+)_.+$','$1')
ans =
b
>>