JavaScript:正则表达式 - 无法用标点符号开头/结尾,不能重复标点符号

Bir*_*rel 2 javascript regex

我正在尝试创建一个正则表达式.规则是:

1)只有字母(上下),数字,句号(.)和下划线(_)

2)必须以字母或数字开头和结尾(即没有句号/下划线)

3)连续不能有多个标点符号(no ..或._或_.或__或.._.等)

4)必须包含至少2个字母(上部或下部或两者都无关紧要)

5)不少于3个字符,不超过25个字符

到目前为止,我所拥有的是:

^((?!.*[\._]{2})[A-Za-z0-9\._]{3,25})$
Run Code Online (Sandbox Code Playgroud)

这是近在咫尺的.我有规则1,3和5,但无法弄清楚2和4.

我以为

(([A-Za-z0-9]?)([A-Za-z0-9\._]+)([A-Za-z0-9]?)){3,25}
Run Code Online (Sandbox Code Playgroud)

会得到规则2,但它只是打破它.

我一直在研究这个问题几个小时,但我找不到或者想出的解决方案都不是我想要的.

您提供的正则表达式声明的解释将非常感激,但并非完全必要.

编辑1

按照noob的建议:

^((?!.*[\._]{2})(([\w\d\.]+)){3,25})$
Run Code Online (Sandbox Code Playgroud)

编辑2

有效:

1rockit.man
q3w
e4.45r.d.2
sp_am
Run Code Online (Sandbox Code Playgroud)

(以及3到25个字符之间的任何其他内容,不带引号或重复标点符号)

无效:

.ret.
123
12a
ret..wer
super_.duper
_petrat
petrat_
Run Code Online (Sandbox Code Playgroud)

小智 7

根据你的条件,我提出了以下正则表达式.它只是对你当前正则表达式的修改.

正则表达式: ^(?=.*[A-Za-z].*[A-Za-z])([A-Za-z0-9]((?!.*[\._]{2})([\w\d\.]{1,23}))[A-Za-z0-9])$

说明:

  • 第一部分(?=.*[A-Za-z].*[A-Za-z])检查整个字符串是否有任何two字符分隔(这几乎就是这种情况).

  • 我在字符串的开头和结尾添加了检查,它应该是字母数字.

  • 除此之外,长度也将随着第一个和最后一个字符的变化而变化,其余的长度将只有23个字符.

Regex101 Demo