boolean exec ( HsrePattern re , CharSequence data , EnumSet < ExecFlags > execFlags ) throws RegexException { /* sanity checks */ /* setup */ if ( 0 != ( re . guts . info & Flags . REG_UIMPOSSIBLE ) ) { throw new RegexException ( "Regex marked impossible" ) ; } eflags = 0 ; for ( ExecFlags ef : execFlags ) { switch ( ef ) { case NOTBOL : eflags |= Flags . REG_NOTBOL ; break ; case NOTEOL : eflags |= Flags . REG_NOTEOL ; break ; case LOOKING_AT : eflags |= Flags . REG_LOOKING_AT ; break ; default : throw new RuntimeException ( "impossible exec flag" ) ; } } this . re = re ; this . g = re . guts ; this . data = data ; this . dataLength = this . data . length ( ) ; if ( this . match != null ) { this . match . clear ( ) ; } else { this . match = Lists . newArrayList ( ) ; } match . add ( null ) ; // make room for 1. if ( 0 != ( g . info & Flags . REG_UBACKREF ) ) { while ( match . size ( ) < g . nsub + 1 ) { match . add ( null ) ; } } if ( mem != null && mem . length >= g . ntree ) { Arrays . fill ( mem , 0 ) ; } else { mem = new int [ g . ntree ] ; } /* do it */ assert g . tree != null ; if ( 0 != ( g . info & Flags . REG_UBACKREF ) ) { return cfind ( g . tree . machine ) ; } else { return find ( g . tree . machine ) ; } }
exec - match regular expression