private static Object matchOrReplace ( Context cx , Scriptable scope , Scriptable thisObj , Object [ ] args , RegExpImpl reImpl , GlobData data , NativeRegExp re ) { String str = data . str ; data . global = ( re . getFlags ( ) & NativeRegExp . JSREG_GLOB ) != 0 ; int [ ] indexp = { 0 } ; Object result = null ; if ( data . mode == RA_SEARCH ) { result = re . executeRegExp ( cx , scope , reImpl , str , indexp , NativeRegExp . TEST ) ; if ( result != null && result . equals ( Boolean . TRUE ) ) result = Integer . valueOf ( reImpl . leftContext . length ) ; else result = Integer . valueOf ( - 1 ) ; } else if ( data . global ) { re . lastIndex = 0d ; for ( int count = 0 ; indexp [ 0 ] <= str . length ( ) ; count ++ ) { result = re . executeRegExp ( cx , scope , reImpl , str , indexp , NativeRegExp . TEST ) ; if ( result == null || ! result . equals ( Boolean . TRUE ) ) break ; if ( data . mode == RA_MATCH ) { match_glob ( data , cx , scope , count , reImpl ) ; } else { if ( data . mode != RA_REPLACE ) Kit . codeBug ( ) ; SubString lastMatch = reImpl . lastMatch ; int leftIndex = data . leftIndex ; int leftlen = lastMatch . index - leftIndex ; data . leftIndex = lastMatch . index + lastMatch . length ; replace_glob ( data , cx , scope , reImpl , leftIndex , leftlen ) ; } if ( reImpl . lastMatch . length == 0 ) { if ( indexp [ 0 ] == str . length ( ) ) break ; indexp [ 0 ] ++ ; } } } else { result = re . executeRegExp ( cx , scope , reImpl , str , indexp , ( ( data . mode == RA_REPLACE ) ? NativeRegExp . TEST : NativeRegExp . MATCH ) ) ; } return result ; }
Analog of C match_or_replace .