40 lines
		
	
	
		
			678 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			678 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"log"
 | 
						|
	"regexp"
 | 
						|
)
 | 
						|
 | 
						|
func regexpSelectN(n int, regexps []string, names []string) (matches []string) {
 | 
						|
	if n <= 0 {
 | 
						|
		matches = make([]string, 0)
 | 
						|
	} else {
 | 
						|
		matches = make([]string, 0, n)
 | 
						|
	}
 | 
						|
 | 
						|
	res := make([]*regexp.Regexp, 0, len(regexps))
 | 
						|
	for _, reStr := range regexps {
 | 
						|
		re, err := regexp.Compile(reStr)
 | 
						|
		if err != nil {
 | 
						|
			log.Printf("warning: invalid regexp ignored: %q: %v", reStr, err)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		res = append(res, re)
 | 
						|
	}
 | 
						|
 | 
						|
namesLoop:
 | 
						|
	for _, name := range names {
 | 
						|
		if len(matches) == n {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		for _, re := range res {
 | 
						|
			if re.MatchString(name) {
 | 
						|
				matches = append(matches, name)
 | 
						|
				continue namesLoop
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return
 | 
						|
}
 |