正则表达式在字符串的末尾找到2个相同的字符

时间:2014-12-15 15:58:25

标签: regex string

我必须找到符合以下规则的正则表达式。

  • 包含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}$))

但我似乎无法在最后找出2个相同的字符?

2 个答案:

答案 0 :(得分:9)

以下内容适用于大多数正则表达式(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 flag:不区分大小写(需要查看Gg,例如,两次相同的字符)

答案 1 :(得分:1)

以下内容应符合您的需求:

^(?=.*\d)[\D\S]\S{5,17}(\S)\1$

Regular expression visualization

Debuggex

的可视化

regex101上的演示