RegexInterpreter.FindFirstChar has multiple schemes it employs for finding the next place a match might exist, and we're adding more. Separately, SymbolicRegexMatcher has its own use of Boyer-Moore and IndexOfAny for when it gets into a state that's guaranteed not part of a match and it can try to zoom ahead to a location to start matching from again. It should be straightforward to factor out RegexInterpreter's FindFirstChar logic into a helper that we can then use from both places, both avoiding existing duplication, avoiding duplicated efforts moving forward, ensuring that SymbolicRegexMatcher benefits from existing RegexInterpreter optimizations, and ensuring SymbolicRegexMatcher benefits from new ones in the near future.