MOO-cows Mailing List Archive

[Prev][Next][Index][Thread]

Re: regex substitution



At 10:53 PM 3/6/96 PST, you wrote:
>That's fine... what I *want* is this:
>
>;strsub("Can we be more patronizing?","mm*","b")
>=> "Can we be bore patronizing?"
>
>but what I get is this:
>
>=> "Can we be more patronizing?"
>
>I have looked at the builtins and at $string_utils and it doesn't
>look like anything does that.  I am curious if someone has written
>something that does do this or if I'm missing something...

You might want to stick this on your $string_utils:

(I only write for 1.8 now :) Quick and dirty, as usual, of course.  But, of
course, works like a charm, and in few ticks also.)

@verb $string_utils:regexp_strsub
@program $string_utils:regexp_strsub
":regexp_strsub ( STR <subject>, STR <regexp>, STR <new> )";
"Returns <subject> with all occurances of <regexp> changed to <new>";
{subject, regexp, new} = args;
if ({typeof(subject), typeof(regexp), typeof(new)} != {STR, STR, STR})
  raise(E_INVARG);
endif
regexp = tostr("%(", regexp, "%)");
while (matched = match(subject, regexp))
  if (typeof(matched) == ERR)
    raise(E_INVARG);
  endif
  if (!matched)
    return subject;
  endif
  if (subject[matched[1]..matched[2]] != "")
    subject[matched[1]..matched[2]] = new;
  endif
endwhile
return subject;

(isn't this a builtin somewhere? weirdness in the making.)  
Then:

;$string_utils:regexp_strsub("Can we be more patronizing?","mm*","b")
=> "Can we be bore patronizing?"
;$string_utils:regexp_strsub("Can we be more patronizing?","xxxx","b")
=> "Can we be more patronizing?"

You will, of course, be smart enough to not make <new> a subset of <regexp>,
right? :)

Hope that is what you need.  Hope you are running 1.8.  Enjoy.









Home | Subject Index | Thread Index