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