from j806
rxmatch_jregex_
4 : 0
if. lb=. 32 = 3!:0 x do. ph=. >0{x else. ph=. x end.
if. cx=. 2 = 3!:0 ph do. hx=. rxcomp ph
else. rxlastxrp=: > 1{((hx=. ph) - 1) ({"1) rxpatterns end.
nsub=. rxnsub rxlastxrp
rxlastrc=: >0{rv=. jregexec rxlastxrp ; (,y) ; rxms ; ((2*rxms)$_1 0) ; 0
if. cx do. rxfree hx end.
m=. (nsub,2)$>4{rv
t=. (0{"1 m)
m=. t,.-~/"1 m
m=. _1 0 ((t=_1)#i.#t)} m
if. lb do. (>1{x){ m else. m end.
)
in J9
rxmatch_jregex_
4 : 0
'p n'=. 2 {. boxopen x
regcomp p
r=. regmatch1 y
if. #n do. n{r end.
)
regcomp_jregex_
3 : 0
if. -.ischar y do. reghandle y return. end.
if. (0<#y) *. y-:lastpattern do. return. end.
regfree''
lastpattern=: y
msg=. ,2
off=. ,2
flg=. PCRE2_MULTILINE*RX_OPTIONS_MULTILINE
lastcomp=: 0 pick rc=. jpcre2_compile (,y);(#y);flg;msg;off;<<0
'msg off'=. 4 5{rc
if. 0=lastcomp do. regerror msg,off end.
lasthandle=: 0
lastmatch=: 0 pick jpcre2_match_data_create_from_pattern (<lastcomp);<<0
lastnsub=: 0 pick jpcre2_get_ovector_count <<lastmatch
EMPTY
)
one pattern where it fails,
'\A[[:alpha:]][[:alnum:]_]+([\.:]+)\Z'&rxmatch every ;: '( + ` - ) gg.'
NB.j806 "correct result"
_1 0
_1 0
_1 0
_1 0
_1 0
_1 0
_1 0
_1 0
_1 0
_1 0
0 3
2 1
9.01 incorrect result (2nd rows 0 0 instead of _1 0 for words that don't end in
.: punctuation and at least 2 chars long)
_1 0
0 0
_1 0
0 0
_1 0
0 0
_1 0
0 0
_1 0
0 0
0 3
2 1
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm