Products
GG网络技术分享 2025-03-18 16:15 2
项目新需求, 需要对登录用户名进行控制, 只允许填写位数字、字母、_和-,且不允许11位纯数字!
我现在有2个正则 :
1, 只允许填写数字, 字母,_和-, 且不允许纯数字 : ^(?!\\d+$)[\\da-zA-Z_-]+$
2, 不允许11位纯数字 : ^((?!^(\\d{11})+$).)*$
现在需要把这2个合起来, 就能满足需求了.
因为要求不是互斥的。不能一个正则写完。判断是十一位且都是数字。
正则为^([\\d]{11})$,匹配直接return false。不匹配接着匹配这个正则^([\\dA-Za-z_]{6,11})$。
https://blog.csdn.net/qq_27485253/article/details/51143238
6-11位,不是纯数字的正则,拿走不谢:
^(?!\\d{11,11})[\\da-zA-Z_-]{6,11}$
第一次遇见不采纳最佳答案而选择南辕北辙的
正则表达式(Regular Expression)
用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。
匹配
文本或字符存在不止一个部分满足给定的正则表达式,这是每一个这样的部分都被称为一个匹配。
元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,元字符可以分为两种类型
元字符只能匹配一个字符位置,也就是一个匹配的单位是一个字符,而不是一个字符串
^a
a
的一行a$
a
的一行^a$
a
的一行\\bStr
Str
为开头的单词ing\\b
ing
为结尾的单词\\bString\\b
String
这个单词\\b
字符如何识别哪个是单词呢?
以标点符号或空格分隔的字符串将被识别为单词,而且 \\b
只能用于英文,不能用于中文
元字符都是按照单个字符进行匹配
.
\\w
\\W
\\s
\\S
\\d
\\D
仅仅是元字符就可以自由组合来实现不同的匹配效果
\\w\\w
\\w\\s
m
是和行末的换行符一起匹配成功的字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。
[]
\\-
\\-
符号不是第一个字符的时候表示定义字符的范围*,例如[1-3]
表示[123]
,[a-z]
表示匹配任意小写字母,如果\\-
放在第一位,那就仅表示自己,这个范围的顺序和两个字符间的内容是按照ASCII表的顺序决定的,例如[9-1]
是违反ASCII表顺序的一个表达式,这会报错^
[^123]
表示匹配1、2、3之外的所有数字[aeiou]
[a-z]
a
到z
之间的所有字母[^aeiou]
[^a-z]
a
到z
之间的所有字母之外的所有字符[0-9]
0
到9
之间的任意一个数字[ao-u]
a
和o
到u
之间的所有字母,可以看到只要在连个字符之间使用连接符-
就会判断为一个区间[!-?]
!
到?
之间的任意一个符号,可以看到因为是按照ASCII表顺序来判断-
连接的字符集合,所以这样写也是没有问题的[a^-]
a
、^
和-
三个字符,只要^
符号不在第一位,-
符号不在两个字符中间,那么它们就只表示自身a[no]
an
或ao
,这是字符类和元字符的组合之前介绍的元字符非常好用,但是这又引出了一个问题,如果我们想在正常的表达式里面使用元字符本身这个符号怎么办呢?难道每次都要写在字符类里面吗?
当然不,这里就引出了我们的字符转义
正则表达式定义了一些特殊的元字符,如^
、$
、.
等。由于这些字符在正则表达式中被解释成其他指定的含义,如果需要匹配这些字符,则需要使用字符转义来解决这个问题。转义字符使用符号\\
(反斜杠),它可以取消这些字符(如^
、$
、.
等)在表达式中具有的特殊意义。
.
.
*
*
\\
\\
www\\.lanyuanxiaoyao\\.com
www\\.lanyuanxiaoyao\\.com
,网址中的dot符号也是需要转义的这是一个重要的知识点
限定符用于指定允许特定字符或字符集自身重复出现的次数。
a{3}
a{2,}
a{2,3}
ab+
ab?
ab*
ab+?
ab??
ab*?
如果在限定符*
、+
、?
、{n}
、{n,}
和{n,m}
之后再添加一个字符 ?
,则表示 尽可能少地重复字符?
之前的限定符号的重复次数,这种匹配方式称为懒惰匹配,与之相对的,如果没有字符 ?
,仅仅使用单个限定符*
、+
、?
、{n}
、{n,}
和{n,m}
的匹配,就称为贪婪匹配。
a.*b
a.?b
替换使用字符|
来表示,表示如果某一个字符串匹配了表达式中字符|
左边或者右边的规则,那么这个字符串就匹配了这个表达式|
表示“或”的意思,这个符号和代码中的“逻辑或”相同,比较好理解
匹配是根据左边优先的原则,即从左往右,当左边的表达式不满足的时候,才会去尝试右边的表达式
a|b
a
还是b
都可以匹配这个表达式,它等同于[ab]
分组又被称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组,分组使用()
来表示,括号中的表达式就是一个组,一个组就是一个整体
要注意和字符类[]
区分开来,[123]
是表示匹配字符1
或2
或3
,而(123)
就是匹配123
这个字符串
组号
当一个正则表达式被分组之后,默认从左到右每一个分组都会自动被赋予一个组号,以左括号(
为分界从1开始自增,第一个组的组号是1,第二个组的组号是2,以此类推,在后面的表达式,使用\\组号
的方式来引用前面的组,例如\\b(\\w)\\1\\b
这个表达式中,后面的\\1
就是对前面(\\w)
组的引用
自定义组号
分组不止会自动使用数字作为组号,还可以手动命名,形式为(?<name>)
,(?<word>\\w)
和(?'word'\\w)
都是把\\w+
匹配到的字母保存到名为word
的分组,自定义命名的分组使用\\k<name>
的方式使用 ,如\\b(?<word>\\w)\\k<word>\\b
是匹配连续的相同的两个字母的单词
\\b(\\w)\\1\\b
这个表达式中的\\1
表示的是前面\\w
匹配到的字符,前面匹配到字母a
那么\\1
处也必须替换为字母a
,而不是任意一个字母 所以这个表达式匹配的是两个完全相同的字母 而如果是\\b(\\w)\\w\\b 则是表示两个允许不相同的字母 (ab)
ab
就是一个整体看待,和单独的字符串ab
没有区别(?<word>ab)\\k<word>
ab
这个组命名为word
,然后在后面调用前面命名的这个组匹配的字符,即这个表达式相当于(ab)ab
(?:a)(b)\\1
(b)
开始,所以后面的\\1
匹配的是(b)
b(?=a)
b
,这个字符b
的后面紧跟着一个a
b(?!a)
b
,这个字符b
的后面不是a
(?<=a)b
b
,这个字符b
的前面是a
(?<!a)b
b
,这个字符b
的前面不是a
(?>a)b
Demand feedback