The expression should not accept any special characters except an underscore and no numbers in it and it should accept single or more alphabets.
Examples
abc_dc (Should be accepted)
_bsc (Should be accepted)
A (Should be accepted)
_ (Should not be accepted)
a__b (should not be accepted)
I have tried:
(^(?!.*?[_]{2})[^_][a-zA-Z_] $)
but this does not accept single alphabet.
CodePudding user response:
You could try following pattern:
^(?=.*[a-zA-Z])(?=[a-zA-Z_] $)(?!.*_{2,}).
Pattern explanation:
Generally, multiple validations are being achieved by placing lookaheads at beginning of a pattern, I used the same strategy.
Explanation:
^
- anchor - match beginning of a string
(?=.*[a-zA-Z])
- positive lookahead - assert that what follows current position is zero or more any characters (.*
) followed by alphabet character. Simply - assert that what follows contains at least one letter.
(?=[a-zA-Z_] $)
- assert what follows contains only letters or underscore until end of string (thanks to $
).
(?!.*_{2,})
- negative lookahead - assert what follows DOES NOT contain two (or more) following underscores (thanks to _{2,}
.
- match on or more of any characters.
CodePudding user response:
I got it.
(^(?!.*?[_]{2})[_]*[a-zA-Z] [a-zA-Z_]*$)
This should work.
CodePudding user response:
I think you could use:
^_?(?:[a-zA-Z] _?) $
See an online demo
^
- Start line anchor._?
- An optional hyphen.(?:
- Open non-capture group:[a-zA-Z] _?
-Match 1 alphachars and an optional hyphen.)*
- Close non-capture group and match 1 times.
$
- End line anchor.
Note: This would also allow for trailing hyphens, e.g: '_a_', 'a_' and '_a_b_'. If you don't want to allow a trailing hyphen, try ^(?:_?[a-zA-Z] ) $
instead.