我必须找到一个符合以下规则的正则表达式。
- 包含 8 到 20 个字符(大写或普通字符)。
- 不包含空格字符。
- 不能以数字 (0-9) 或下划线 (_) 开头。
- 在字符串的末尾,它必须是 2 个相同的字符。
- 必须包含至少 1 个数字。
好的:
+234567899
a_1de*Gg
xy1Me*__
!41deF_hij2lMnopq3ss
C234567890123$^67800
*5555555
sDF564zer""
!!!!!!!!!4!!!!!!!!!!
abcdefghijklmnopq9ss
不行:
多于或少于 8-20 个字符:
a_1+Eff
B41def_hIJ2lmnopq3stt
abCDefghijklmnopqrss5
有空格字符:
A_4 e*gg
以数字或下划线开头:
__1+Eff
841DEf_hij2lmnopq3stt
以两个不同的字符结尾:
a_1+eFg
b41DEf_hij2lmnopq3st
不包含数字:
abCDefghijklmnopqrss
abcdef+++dF
!!!!!!!!!!!!!!!!!!!!
到目前为止我有这个
((?m:[^0-9_]^(?=.*[0-9])\S{8,20}$))
但我似乎无法找出最后两个相同的字符?
最佳答案
以下内容适用于大多数正则表达式(PCRE、Python、PHP、JavaScript):
/^(?=\S{8,20}$)(?=\D*\d)(?![0-9_]).{6,18}?(.)\1$/i
Demo with unit tests against your sample cases
解释:
/
分隔符^
字符串开头(?=\S{8,20}$)
后跟 8-20 个非空白字符(?=\D*\d)
包含一个数字(?![0-9_])
不能以数字或下划线开头.{6,18}?
非贪心字符匹配(将我们从字符串的开头移到结尾)(.)\1
匹配任意字符,后跟同一个字符$
字符串结尾/
分隔符i
标志:不区分大小写(需要看到Gg
,例如两次作为同一个字符)
关于正则表达式在字符串末尾找到 2 个相同的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488063/