Edgar Nunez
Edgar Nunez

Reputation: 61

RegEx: Non-repeating patterns?

I'm wrestling with how to write a specific regex, and thought I'd come here for a little guidance.

What I'm looking for is an expression that does the following:

(Now, here's where I'm having problems):

To give you an example, the string AAAAAA# would match, as would the string AAAAAAa. However, the string AAAAAAA, nor would the string AAAAAA& (as the ampersand was not part of the special character pattern).

Any ideas? Thanks!

Upvotes: 2

Views: 1413

Answers (2)

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

If you only need two different kinds of characters, you can use the possessive quantifier feature (available in Objective C):

^(?:[a-z]++|[A-Z]++|[0-9]++|[#$%@]++)[a-zA-Z0-9#$%@]+$

or more concise with an atomic group:

^(?>[a-z]+|[A-Z]+|[0-9]+|[#$%@]+)[a-zA-Z0-9#$%@]+$

Since each branch of the alternation is a character class with a possessive quantifier, you can be sure that the first character matched by [a-zA-Z0-9#$%@]+ is from a different class.

About the string size, check it first separately with the appropriate function, if the size is too small, you will avoid the cost of a regex check.

Upvotes: 2

glibdud
glibdud

Reputation: 7840

First you need to do a negative lookahead to make sure the entire string doesn't consist of characters from a single group:

(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)

Then check that it does contain at least 7 characters from the list of legal characters (and nothing else):

^[a-zA-Z0-9#$%@]{7,}$

Combining them (thanks to Shlomo for pointing that out):

^(?!(?:[a-z]*|[A-Z]*|[0-9]*|[#$%@]*)$)[a-zA-Z0-9#$%@]{7,}$

Upvotes: 1

Related Questions