PowerShell: 119
===

**Gofled Code**

    for(;!($x-cmatch'.*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!-/:-@[-`{-~]).*')){$x='';1..15|%{$x+=[char](33..126|random)}}$x

**Un-golfed and Commented**

    # Start for loop definition.
    for(
        # Skip variable initialization, start definition of run condition.
        ;
        # Loop runs if $x does not meet complexity requirements.
        # Length requirement is not tested here because it is enforced by the generator later.
        # Much thanks to @VasiliSyrakis for the RegEx help.
        !($x-cmatch'.*(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!-/:-@[-`{-~]).*')
    )
    {
        # Reset $x in case the script block has already run.
        $x='';
        # Use ForEach-Object, via the % alias, to run a loop 15 times.
        1..15|%{
            # Append a random ASCII character from 33-126 to $x.
            # Note: Use get-random instead of random for faster performance.
            $x+=[char](33..126|random)
        }
    }
    # Display $x.
    $x
    # Variable cleanup - not included in golfed code.
    rv x