icicle-occur (bound to
C-' in Icicle mode) does this.
As you type into the minibuffer, the lines matching the pattern you type are shown as completion candidates. Your pattern can be as simple or as complex (e.g. a regexp) as you like. You can change the pattern dynamically, and the set of matches changes accordingly.
You can combine search patterns, that is, you can use any number of them to narrow the set of search hits. It is typically much easier to use two or more simple search patterns than it is to try to come up with a complex regexp that does exactly what you want. (But each of the individual search patterns can be as complex as you like.)
You can cycle among matches, or you can visit any of them, in any order. You can even replace matches selectively, on demand.
See the Overview of Icicles Search.