Hi
Is this what you want? (Note: \n is a backreference to n-th match of the
pattern)
assert '**123*'-:('[0-9]+';'**\0*') pysub '123'
assert 'ab 123*y*45 de'-:('([0-9]+)([x]+)([0-9]+)';'\1*y*\3') pysub 'ab
123x45 de'
assert '
https://www.jsoftware.com/wiki/help/pcre/pcrepattern.html'-:('http://([
^/]+)';'https://\1/wiki') pysub '
http://www.jsoftware.com/help/pcre/pcrepattern.html'
Following is my quick and crude implementation(written and tested in J801):
NB. API is inspired by python's re.sub :
https://docs.python.org/2/library/re.html
coclass 'PySub'
load 'regex'
create=: 3 : 0
pysub_y=: 0 $ 0
pysub_matches=: 0 $ 0
)
destory=: codestroy
backref=: 3 : 0
ind=.". }. y
{.>(ind {"2 pysub_matches) rxfrom pysub_y
)
pysub=: 4 : 0
'pat repl'=.x
pysub_y=:y
pysub_matches=:pat rxmatches y
rptxt=.'\\[0-9]+' backref rxapply repl
(pat;rptxt) rxrplc y
)
pysub_z_=: 4 : 0
obj=. '' conew 'PySub'
r=.x pysub__obj y
destory__obj ''
r
)
assert '**123*'-:('[0-9]+';'**\0*') pysub '123'
assert 'ab 123*y*45 de'-:('([0-9]+)([x]+)([0-9]+)';'\1*y*\3') pysub 'ab
123x45 de'
assert '
https://www.jsoftware.com/wiki/help/pcre/pcrepattern.html'-:('http://([
^/]+)';'https://\1/wiki') pysub '
http://www.jsoftware.com/help/pcre/pcrepattern.html'
On Sat, Aug 30, 2014 at 5:38 PM, Raul Miller <[email protected]> wrote:
> Actually, that's buggy.
>
> I should have said:
>
> mid=. (,:({:-{.@,,0:)M) rxcut 1{::segs
>
> Oops...
>
> --
> Raul
>
>
> On Sat, Aug 30, 2014 at 4:13 AM, Raul Miller <[email protected]>
> wrote:
> > J has "PCRE" regular expressions:
> >
> > require 'regex'
> > url=: 'http://www.jsoftware.com/help/pcre/pcrepattern.html'
> > >('http://[^/]+'&rxmatch rxcut ]) url
> >
> > http://www.jsoftware.com
> > /help/pcre/pcrepattern.html
> >
> > Now.. regular expressions seem like they ought to be a natural fit for
> > J - if nothing else, the sort of people who turn up their nose at J
> > syntax are probably either (a) so inured to regular expressions that
> > they forget how they look, or (b) can't stand regular expressions.
> >
> > That said... PCRE stands for "perl compatible regular expressions" and
> > J is missing a significant feature from perl's implementation: string
> > interpolation.
> >
> > Perl has a string language where you can specify variables to plug
> > into the string, and PCRE ties into that mechanism. J is significantly
> > more verbose for this kind of thing.
> >
> > In other words, in perl, I could do this:
> > $url=~ s{http://([^/]+)}{https://$1/wiki};
> >
> > and if $url were the value of url, above (in perl scalar variable
> > names begin with $ and strings are treated as scalars - perl does not
> > have J's concept of rank and instead approximates it with the rank
> > indicator hard-coded into the variable name), then the above sentence
> > would modify its value to be:
> >
> > https://www.jsoftware.com/wiki/help/pcre/pcrepattern.html
> >
> > Here's some equivalent (explicit) J:
> >
> > if. {:,M=. 'http://([^/]+)' rxmatch url do.
> > segs=. M rxcut url
> > mid=. (,:({:-{.@{.)M) rxcut 1{::segs
> > url=. ;}.(<'https://',(1{::mid),'/wiki') 1} segs
> > end.
> >
> > As you can see, it's a bit more complex.
> >
> > So ...
> >
> > I'm not going to tackle writing such a thing - at least, not tonight.
> > But that's something that might be nice - support for a string
> > interpolation language, including tie-in support for the jregex
> > locale.
> >
> > (I am mostly writing this to organize my thoughts - as you can see,
> > this topic is messy enough in J that organizing thoughts is probably a
> > good idea.)
> >
> > (And, yes, this particular task could be accomplished more easily in J
> > - my actual task is more complicated and needs a more involved regular
> > expression. I'm just outlining what I see as an issue.)
> >
> > Thanks,
> >
> > --
> > Raul
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm