@ -29,8 +29,11 @@ func findAllMatches(start *State, str string) (indices []matchIndex) {
return findAllMatchesHelper ( start , str , make ( [ ] matchIndex , 0 ) , 0 )
}
func findAllMatchesHelper ( start * State , str string , indices [ ] matchIndex , offset int ) [ ] matchIndex {
// 'Base case' - exit if string is empty
// 'Base case' - exit if string is empty . If the starting state is a last-state, then append the final set of indices (trailing whitespace)
if len ( str ) == 0 {
if start . isLast {
indices = append ( indices , matchIndex { offset , offset + 1 } )
}
return indices
}
@ -74,16 +77,17 @@ func findAllMatchesHelper(start *State, str string, indices []matchIndex, offset
if len ( state . transitions [ int ( str [ i ] ) ] ) > 0 {
tempStates = append ( tempStates , state . transitions [ int ( str [ i ] ) ] ... )
foundPath = true
} else {
// This enables the 'greedy' behavior - last-state status is only checked if we can't match anything else
}
}
if foundPath == false {
// This enables the 'greedy' behavior - last-state status is only checked if we didn't find a path forward
for _ , state := range currentStates {
if state . isLast {
endIdx = i
indices = append ( indices , matchIndex { startIdx + offset , endIdx + offset } )
}
}
}
if foundPath == false {
// Recursion - match with rest of string if we have nowhere to go. If we haven't moved in the string, increment the counter by 1 to ensure we don't keep trying the same string over and over
if i == startingFrom {
i ++