Stardust
Stardust

Reputation: 1125

REGEX - How to match set of string with at least one special character anywhere?

I have a problem in matching password using following regex.

^[A-Za-z\d[\!\@\#\$\%\^\&\*\(\)\_\+]{1,}]{6,}$

In above expression I want user to enter at least one special anywhere with remaining characters should be alphanumeric. The password length can't be less than six.

But the above expression is allowing user to enter not any special character. Could anyone please tell me how can I restrict the user to enter at least one special character?

Upvotes: 1

Views: 6297

Answers (2)

Toto
Toto

Reputation: 91518

How about:

^(?=[\w!@#$%^&*()+]{6,})(?:.*[!@#$%^&*()+]+.*)$

explanation:

The regular expression:

(?-imsx:^(?=[\w!@#0^&*()+]{6,})(?:.*[!@#0^&*()+]+.*)$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    [\w!@#0^&*()+]{6,}       any character of: word characters (a-z,
                             A-Z, 0-9, _), '!', '@', '#', '0', '^',
                             '&', '*', '(', ')', '+' (at least 6
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
    [!@#0^&*()+]+            any character of: '!', '@', '#', '0',
                             '^', '&', '*', '(', ')', '+' (1 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

Upvotes: 9

Himanshu
Himanshu

Reputation: 2454

Instead of complicating your regex, how about iterating over the chars and counting the special ones

count = 0
for char in string:
    if isspecial(char):
        count = count+1

if count > 1:
    reject()

Upvotes: 3

Related Questions