on *:text:!searchip &:*: {
  if (. !isin $2) {
    if (($2 !isnum) && ($hget(userips,$2))) { .msg $nick $2 $+ 's IPs are: $v1 }
    else { .msg $nick No matches for nick $qt($2) }
  }
  else { 
    ; $1 is a valid (wildcard-)IP "A.A.A.A" (where each A is 1-3 digits/wildcards)
    var %isipreg = /^(?:(?:\d|\*|\?){1,3}\.){3}(\d|\*|\?){1,3}$/
    if ($regex($2,%isipreg)) {
      ; replaces to build a regex that will match wild-IP $2 in a comma-delimited string of IPs
      var %findreg = $replace($regsubex($2,/\*+/g,*),.,\.,*,\d*,?,\d) 
      var %findreg = $+(/(?<=^|\54),%findreg,(?=$|\54)/)
      write -c searchip.txt
     ; perform hfind loop, write results to a file
      var %n = 1
      while ($hfind(userips,%findreg,%n,r).data) {
        write searchip.txt $v1
        inc %n
      }
      var %l = $lines(searchip.txt)
      if (%l = 0) { .msg $nick There are no matches for IP $qt($2) }
      else { 
        ; sort file, play results to nick
        filter -ffct 1 32 searchip.txt searchip.txt
        .msg $nick There $iif((%l == 1),is %l match,are %l matches) for IP $qt($2) : 
        play -m2 $nick searchip.txt 300
      }
    }
    else { .msg $nick Wrong Syntax. use !searchip <nick> or !searchip <IP>. <IP> has to be N.N.N.N and may contain wildcards. }
  } 
}