*_______________________________________________________________________________ function PasswordTest() local obj obj = createobject('VBScript.RegExp') obj.IgnoreCase = .f. obj.Global = .f. local specialChars, p1, p2, p3, p4, p5 specialChars = "!@#$%^&*_+=':;.,-" && hyphen at the end && positive lookaheads = p1, p2, p3, p4 && length test = p5 p1 = "(?=.*[~~].*[~~])" && at least two of those chars p1 = strtran(p1, '~~', specialChars ) p2 = '(?=.*\d.*\d)' && at least two digits p3 = '(?=.*[A-Z].*[A-Z])' && at least two uppercase p4 = '(?=.*[a-z].*[a-z])' && at least two lowercase p5 = '[\S]{10,}' && at least 10 non white space char && p5 = '.{10,}' && at least 10 chars local pattern pattern = '^' + p1 + p2 + p3 + p4 + p5 + '$' obj.Pattern = pattern local goodOnes text to goodOnes noshow flags 1 pretext 7 A1B+2;abcd 12xxA1B+2; endtext local badOnes text to badOnes noshow flags 1 pretext 7 A1B+2;abc A1c+2;abcd A1B+24abcd endtext do case case !PasswordResultTest(obj, goodOnes , .t.) ? 'fail' case !PasswordResultTest(obj, badOnes , .f.) ? 'fail' otherwise ? 'ok' endcase endfunc *_______________________________________________________________________________ function PasswordResultTest( regexObj, cases, expect) local aa[1], naa, i, pw, result, success naa =alines(aa, m.cases, 1) for i = 1 to naa pw = aa[m.i] result = regexObj.Test(pw) ? 'expect ', m.expect, ' got', result, ' :', pw success = result == expect if( !m.success ) return .f. endif endfor endfunc *_______________________________________________________________________________