diff --git a/regex/matching.go b/regex/matching.go index dab6446..d2925bd 100644 --- a/regex/matching.go +++ b/regex/matching.go @@ -251,35 +251,39 @@ func (regex Reg) FindAllSubmatch(str string) []Match { return indices } -func addStateToList(idx int, list []nfaState, state nfaState, threadGroups []Group) []nfaState { +func addStateToList(str []rune, idx int, list []nfaState, state nfaState, threadGroups []Group) []nfaState { if stateExists(list, state) { return list } if state.isKleene || state.isQuestion { copyThread(state.splitState, state) - list = addStateToList(idx, list, *state.splitState, threadGroups) + list = addStateToList(str, idx, list, *state.splitState, threadGroups) copyThread(state.next, state) - list = addStateToList(idx, list, *state.next, threadGroups) + list = addStateToList(str, idx, list, *state.next, threadGroups) return list } if state.isAlternation { copyThread(state.next, state) - list = addStateToList(idx, list, *state.next, threadGroups) + list = addStateToList(str, idx, list, *state.next, threadGroups) copyThread(state.splitState, state) - list = addStateToList(idx, list, *state.splitState, threadGroups) + list = addStateToList(str, idx, list, *state.splitState, threadGroups) return list } - state.threadGroups = append([]Group{}, threadGroups...) + if state.assert != noneAssert { + if state.checkAssertion(str, idx) { + copyThread(state.next, state) + return append(list, addStateToList(str, idx, list, *state.next, state.threadGroups)...) + } + } if state.groupBegin { state.threadGroups[state.groupNum].StartIdx = idx - return append(list, addStateToList(idx, list, *state.next, state.threadGroups)...) + return append(list, addStateToList(str, idx, list, *state.next, state.threadGroups)...) } if state.groupEnd { state.threadGroups[state.groupNum].EndIdx = idx - return append(list, addStateToList(idx, list, *state.next, state.threadGroups)...) + return append(list, addStateToList(str, idx, list, *state.next, state.threadGroups)...) } - state.threadGroups = append([]Group{}, threadGroups...) return append(list, state) } @@ -340,7 +344,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in start.threadGroups = newMatch(numGroups + 1) start.threadGroups[0].StartIdx = i - currentStates = addStateToList(i, currentStates, *start, start.threadGroups) + currentStates = addStateToList(str, i, currentStates, *start, start.threadGroups) var match Match = nil // var isEmptyAndNoAssertion bool // Main loop @@ -362,7 +366,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in break } else if !currentState.isAlternation && !currentState.isKleene && !currentState.isQuestion && !currentState.groupBegin && !currentState.groupEnd { // Normal character or assertion if currentState.contentContains(str, idx) { - nextStates = addStateToList(idx+1, nextStates, *currentState.next, currentState.threadGroups) + nextStates = addStateToList(str, idx+1, nextStates, *currentState.next, currentState.threadGroups) } }