请详细解释一下你的正则表达式

时间:2022-11-27 18:47:00
        // 限定条件
         final String CONDITION = "(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)";

        // 允许出现的字符
         final String SPECIAL_CHAR = "[-A-Za-z0-9!$%&()/;<?{}\\[\\]^\\\\]";

        // 数量
         final String QUANTITY = "{8,16}";


2,3 都好理解,第一个理解不了,能否详细介绍一下呢。明天加分到200.

拜托了。。。。


51 个解决方案

#1


该回复于2015-05-26 11:03:41被管理员删除

#2


关键你要理解“?=x”的意义:后面允许出现字母x

#3


要解释这个,得先弄清楚 (?=) 这个表示什么意思,这个的意思我在你另外的一个帖子里已经说得很详细了

http://topic.csdn.net/u/20080627/14/8a91b33a-f35c-4303-85b5-e0a8da462202.html
1 楼的回复

(?=.*[a-z]) 表示当前位置后面必须出现 .*[a-z] 的字符,这个可以理解为必须出现小写字母。
或者可以理解为某一个字符间的缝隙必须满足的条件,这个仅仅作为条件判断并不能匹配任何字
符,因为这属于非捕获组中的环视(lookarround)零宽度匹配。

举个大家常见的例子:

表达式:Win(?=XP)
现有字符串 WinXP 和 WinNT,在应用这个表达式时前者能与之进行匹配,为什么呢?

当匹配器指示到 (?=XP) 时,也就是在 n 字母后面的缝隙,这个缝隙必须满足的
条件是:后面的字符必须是 XP,如果是的话,匹配成功,否则匹配失败。由于
(?=XP) 是匹配缝隙的,因此并不会把 XP 给匹配输出,而只输出了 Win 因此,这
个表达式的语义可以看作是:找到后面为“XP”字符所有的 Win。

假如,我们把表达式写成 Win(?=XP)(?=NT) 这样的话,那么这个语义是:找出后面
为“XP” 并且为“NT”字符所有的 Win 可以想象,这是个
永远无法满足的匹配。 (?=XP)(?=NT) 这个表示当前的缝隙必须同时满足的条件

把这个表达式再改一下,改成 Win(?=.*XP)(?=.*NT) 这个表示 Win 的后面必须出现
XP 与 NT,位置和顺序都是无关的(这主要是 .* 的作用)。当然了这个表达式的效
率是比较低的,得向后进行两次断言。

如果字符串是 WincbaXPabcNT 这个字符串,当匹配指示器走到 n 后面的缝隙时开始
进行向后断言,首先对 .*XP 进行断言,很明显能将 cbaXP 匹配成功,这时第一个断
言完成,再对 .*NT 断言,可以看出 cbaXPabcNT 能与其匹配成功,这时第二个断言完
成,因此表达式 Win(?=.*XP)(?=.*NT) 能对 WincbaXPabcNT 进行匹配。

同理 WincbaNTabcXP 也是同样的效果。

如果能理解上面的这些,对于 (?=.*[a-z])(?=.*[A-Z])(?=.*\\d) 这个的理应该不会
很难吧,这个只不过是必须同时满足三个条件。

这个表达式在开始部分就进行断言,即索引为 0 的地方,也就是第一个字符的前面的
缝隙,这个缝隙后面的字符必须满足 .*[a-z]  .*[A-Z]  .*\\d  三个条件,也就是说
必后面必须出现 至少一个小写字母、至少一个大写母、至少一个数字

#4


至于表达式 2 的使用,也就是 [  ] 内字符的转义需要注意一下。

^ 和 - 在 [  ] 结构的表达式中是有一定意义的。

[^abc] 表示除 abc 以外所有的字符,注意,这是放在最前面表示这个意思,
如果改成 [a^bc] 这个仅表示 a ^ b c 四个字符。如果需要匹配 ^ 这个字符
的话,千万不要把它放在第一个,如果一定要放在第一个的话,得使用转义符。

- 在 [  ] 表示字符的范围,比如 [a-z] 表示 a 与 z 之间的 26 个字母,
[a-zA-Z] 这个表示 a-z 和 A-Z 的 52 个字母。使用范围得注意了,如果写成
[z-a] 的话,在 Pattern.compile 编译表达式时会对范围进行检查,这时会产
生异常,因此在使用 - 范围时,后面的 Unicode 值必须大于等于前面的 Unicode
值。

如果要匹配“-”的话,尽量不要把 - 这个放在字符之间,可以放在 [  ] 的两边。
比如 [-a-z] 这就能匹配 26 个小写字母和“-”了。当然了,我们也可以写成
[a-z-A-Z] 这个可以匹配 52 字母和“-”,但是这样很不直观,我们宁愿写成
[a-zA-Z-] 或者 [-a-zA-Z] 这样。

#5


请详细解释一下你的正则表达式  火龙果累了,得睡觉去了~~

#6


火龙果真牛,学习了

#7


mark

#8


火龙果已经解释了够详细的了.建议楼主还是要系统的学习下.请看下面链接.
请点这里看正则表达式30分钟入门教程

#9


火龙果不是一般的牛!

正则太厉害了。

不过正则这个东西还真是管用!

#10


bao110908 火龙果  解释的相当清晰 赞一个....

#11


mark

#12


ding

#13


学习了。。。

#14


见识了~

#15


学习啦

#16


引用 9 楼 jishu_vip 的回复:
火龙果不是一般的牛! 

正则太厉害了。 

不过正则这个东西还真是管用!

#17


学习学习

#18


记号,哈哈

#19


CSDN的牛人果然多!学习了!

#20


呵呵,下个js帮助吧,上面全有!
就这么回事!

#21


看了,你也记不住,我每次都看帮助.

#22


火龙果牛!

#23


学习之~

#24


正则表达式的?=术语是叫正向前瞻。还有叫负向前瞻(te(?=ncent) 要用小括号括起来

#25


正则表达式的?=术语是叫正向前瞻。还有叫负向前瞻(te(?=

#26


关键你要理解“?=x”的意义:后面允许出现字母x 

#27


把这个表达式再改一下,改成 Win(?=.*XP)(?=.*NT) 这个表示 Win 的后面必须出现 
XP 与 NT,位置和顺序都是无关的(这主要是 .* 的作用)。当然了这个表达式的效 
率是比较低的,得向后进行两次断言。 

如果字符串是 WincbaXPabcNT 这个字符串,当匹配指示器走到 n 后面的缝隙时开始 
进行向后断言,首先对 .*XP 进行断言,很明显能将 cbaXP 匹配成功,这时第一个断 
言完成,再对 .*NT 断言,可以看出 cbaXPabcNT 能与其匹配成功,这时第二个断言完 
成,因此表达式 Win(?=.*XP)(?=.*NT) 能对 WincbaXPabcNT 进行匹配。 

同理 WincbaNTabcXP 也是同样的效果。 

如果能理解上面的这些,对于 (?=.*[a-z])(?=.*[A-Z])(?=.*\\d) 这个的理应该不会 
很难吧,这个只不过是必须同时满足三个条件。 

这个表达式在开始部分就进行断言,即索引为 0 的地方,也就是第一个字符的前面的 
缝隙,这个缝隙后面的字符必须满足 .*[a-z]  .*[A-Z]  .*\\d  三个条件,也就是说 
必后面必须出现至少一个小写字母、至少一个大写母、至少一个数字。 

#28


http://www.eimhe.com/bbs/?fromuid=494589
更多的学习资料提供给广大的IT朋友们

#29


大家如果编译原理的词法分析部分学的好,正则表达式一点都不难

#30


回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!

#31


学习

#32


记号

#33


***************************************************************************

思想决定行动,行动决定习惯,习惯决定命运.
程序员在深圳QQ群,交流思想,如饮美酒.

部份专业群介绍:
c++群:  15195967(此群流动性相当大,有时候一个月上百人*离群)
java群: 11878667(此群人数较少,但不知道群主会不会让你进群,进群要求很高)
英语学习群:  23864353(此群人气一般,交流也车不够活跃)
c++Ⅱ:  17409451(此群是C++第一群的补充,人气自然差点)
嵌入式开发群:  37489763(此群高手还是有的,气氛一般)
移动开发群:  31501597(此群人气和氛围都还可以)
创业群:  33653422(此群名字就注定了讨论的东西一般没有结果.)


部份高级程序员群(高级群致力于发现和培养专家,人气最旺,淘汰率高,不自信者不要加入):

高级群I:17538442
高级群II:7120862

部份初、中级程序员群:
第三群:2650485
第五群:29537639
第四群:28702746
第六群:10590618
第七群:10543585
第八群:12006492
第九群:19063074
第十群:2883885
第十一群:25460595
第十二群:9663807

深圳程序员QQ群联盟成立2005年,拥有三十个以上的QQ群,人数超三千多人,大量高手,从业于大公司(微软、IBM,SUN,华为)、系统分析员(包括参加过上亿元的项目的架构师)。每个人都自信而上进.推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 java群: 11878667  mobile:31501597嵌入式:37489763   
—————————————————————————————————————————— 
如果你不是第一次看到此广告,说明我们最近T了一些人,因为我们要不断提升群的质量,保证名副其实.
-------------------------------------------------------------------------------------
在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到: 
      1. 通读手册,试着自己找答案。 
      2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。 
      3. 在网上搜索(个人推荐google~)。 
      4. 向你身边精于此道的朋友打听。 
我想我们首先应该靠自己解决问题,然后才是问
------------------------------------------------------------------------------------------------------

技术QQ群是一个体现群体智慧的地方,无价值的发言会给别人带来噪音和负担,如果不同意以上观点的请勿加入!

*****************************************************************************

#34


学习了 写得很明白

#35


记号

#36


路过学习!!!!

#37


mark

#38


// 限定条件
(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)

请问一下,这种表达式在validation.xml里不适用?

#39


路过~

#40


该回复于2009-06-26 09:23:26被版主删除

#41


Marked by Bigbug9002

#42


顶!

#43


mark 下。。。睡觉了

#44


全是高手高手啊……

#45


nice job!!

#46


开始学习正则表达式

#47


学习了~~~

#48


顶!!!!!!!!1

#49


我去!这么老的贴啊!

#50


回复。

#1


该回复于2015-05-26 11:03:41被管理员删除

#2


关键你要理解“?=x”的意义:后面允许出现字母x

#3


要解释这个,得先弄清楚 (?=) 这个表示什么意思,这个的意思我在你另外的一个帖子里已经说得很详细了

http://topic.csdn.net/u/20080627/14/8a91b33a-f35c-4303-85b5-e0a8da462202.html
1 楼的回复

(?=.*[a-z]) 表示当前位置后面必须出现 .*[a-z] 的字符,这个可以理解为必须出现小写字母。
或者可以理解为某一个字符间的缝隙必须满足的条件,这个仅仅作为条件判断并不能匹配任何字
符,因为这属于非捕获组中的环视(lookarround)零宽度匹配。

举个大家常见的例子:

表达式:Win(?=XP)
现有字符串 WinXP 和 WinNT,在应用这个表达式时前者能与之进行匹配,为什么呢?

当匹配器指示到 (?=XP) 时,也就是在 n 字母后面的缝隙,这个缝隙必须满足的
条件是:后面的字符必须是 XP,如果是的话,匹配成功,否则匹配失败。由于
(?=XP) 是匹配缝隙的,因此并不会把 XP 给匹配输出,而只输出了 Win 因此,这
个表达式的语义可以看作是:找到后面为“XP”字符所有的 Win。

假如,我们把表达式写成 Win(?=XP)(?=NT) 这样的话,那么这个语义是:找出后面
为“XP” 并且为“NT”字符所有的 Win 可以想象,这是个
永远无法满足的匹配。 (?=XP)(?=NT) 这个表示当前的缝隙必须同时满足的条件

把这个表达式再改一下,改成 Win(?=.*XP)(?=.*NT) 这个表示 Win 的后面必须出现
XP 与 NT,位置和顺序都是无关的(这主要是 .* 的作用)。当然了这个表达式的效
率是比较低的,得向后进行两次断言。

如果字符串是 WincbaXPabcNT 这个字符串,当匹配指示器走到 n 后面的缝隙时开始
进行向后断言,首先对 .*XP 进行断言,很明显能将 cbaXP 匹配成功,这时第一个断
言完成,再对 .*NT 断言,可以看出 cbaXPabcNT 能与其匹配成功,这时第二个断言完
成,因此表达式 Win(?=.*XP)(?=.*NT) 能对 WincbaXPabcNT 进行匹配。

同理 WincbaNTabcXP 也是同样的效果。

如果能理解上面的这些,对于 (?=.*[a-z])(?=.*[A-Z])(?=.*\\d) 这个的理应该不会
很难吧,这个只不过是必须同时满足三个条件。

这个表达式在开始部分就进行断言,即索引为 0 的地方,也就是第一个字符的前面的
缝隙,这个缝隙后面的字符必须满足 .*[a-z]  .*[A-Z]  .*\\d  三个条件,也就是说
必后面必须出现 至少一个小写字母、至少一个大写母、至少一个数字

#4


至于表达式 2 的使用,也就是 [  ] 内字符的转义需要注意一下。

^ 和 - 在 [  ] 结构的表达式中是有一定意义的。

[^abc] 表示除 abc 以外所有的字符,注意,这是放在最前面表示这个意思,
如果改成 [a^bc] 这个仅表示 a ^ b c 四个字符。如果需要匹配 ^ 这个字符
的话,千万不要把它放在第一个,如果一定要放在第一个的话,得使用转义符。

- 在 [  ] 表示字符的范围,比如 [a-z] 表示 a 与 z 之间的 26 个字母,
[a-zA-Z] 这个表示 a-z 和 A-Z 的 52 个字母。使用范围得注意了,如果写成
[z-a] 的话,在 Pattern.compile 编译表达式时会对范围进行检查,这时会产
生异常,因此在使用 - 范围时,后面的 Unicode 值必须大于等于前面的 Unicode
值。

如果要匹配“-”的话,尽量不要把 - 这个放在字符之间,可以放在 [  ] 的两边。
比如 [-a-z] 这就能匹配 26 个小写字母和“-”了。当然了,我们也可以写成
[a-z-A-Z] 这个可以匹配 52 字母和“-”,但是这样很不直观,我们宁愿写成
[a-zA-Z-] 或者 [-a-zA-Z] 这样。

#5


请详细解释一下你的正则表达式  火龙果累了,得睡觉去了~~

#6


火龙果真牛,学习了

#7


mark

#8


火龙果已经解释了够详细的了.建议楼主还是要系统的学习下.请看下面链接.
请点这里看正则表达式30分钟入门教程

#9


火龙果不是一般的牛!

正则太厉害了。

不过正则这个东西还真是管用!

#10


bao110908 火龙果  解释的相当清晰 赞一个....

#11


mark

#12


ding

#13


学习了。。。

#14


见识了~

#15


学习啦

#16


引用 9 楼 jishu_vip 的回复:
火龙果不是一般的牛! 

正则太厉害了。 

不过正则这个东西还真是管用!

#17


学习学习

#18


记号,哈哈

#19


CSDN的牛人果然多!学习了!

#20


呵呵,下个js帮助吧,上面全有!
就这么回事!

#21


看了,你也记不住,我每次都看帮助.

#22


火龙果牛!

#23


学习之~

#24


正则表达式的?=术语是叫正向前瞻。还有叫负向前瞻(te(?=ncent) 要用小括号括起来

#25


正则表达式的?=术语是叫正向前瞻。还有叫负向前瞻(te(?=

#26


关键你要理解“?=x”的意义:后面允许出现字母x 

#27


把这个表达式再改一下,改成 Win(?=.*XP)(?=.*NT) 这个表示 Win 的后面必须出现 
XP 与 NT,位置和顺序都是无关的(这主要是 .* 的作用)。当然了这个表达式的效 
率是比较低的,得向后进行两次断言。 

如果字符串是 WincbaXPabcNT 这个字符串,当匹配指示器走到 n 后面的缝隙时开始 
进行向后断言,首先对 .*XP 进行断言,很明显能将 cbaXP 匹配成功,这时第一个断 
言完成,再对 .*NT 断言,可以看出 cbaXPabcNT 能与其匹配成功,这时第二个断言完 
成,因此表达式 Win(?=.*XP)(?=.*NT) 能对 WincbaXPabcNT 进行匹配。 

同理 WincbaNTabcXP 也是同样的效果。 

如果能理解上面的这些,对于 (?=.*[a-z])(?=.*[A-Z])(?=.*\\d) 这个的理应该不会 
很难吧,这个只不过是必须同时满足三个条件。 

这个表达式在开始部分就进行断言,即索引为 0 的地方,也就是第一个字符的前面的 
缝隙,这个缝隙后面的字符必须满足 .*[a-z]  .*[A-Z]  .*\\d  三个条件,也就是说 
必后面必须出现至少一个小写字母、至少一个大写母、至少一个数字。 

#28


http://www.eimhe.com/bbs/?fromuid=494589
更多的学习资料提供给广大的IT朋友们

#29


大家如果编译原理的词法分析部分学的好,正则表达式一点都不难

#30


回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!回帖是一种美德!传说每天回帖即可获得 10 分可用分!

#31


学习

#32


记号

#33


***************************************************************************

思想决定行动,行动决定习惯,习惯决定命运.
程序员在深圳QQ群,交流思想,如饮美酒.

部份专业群介绍:
c++群:  15195967(此群流动性相当大,有时候一个月上百人*离群)
java群: 11878667(此群人数较少,但不知道群主会不会让你进群,进群要求很高)
英语学习群:  23864353(此群人气一般,交流也车不够活跃)
c++Ⅱ:  17409451(此群是C++第一群的补充,人气自然差点)
嵌入式开发群:  37489763(此群高手还是有的,气氛一般)
移动开发群:  31501597(此群人气和氛围都还可以)
创业群:  33653422(此群名字就注定了讨论的东西一般没有结果.)


部份高级程序员群(高级群致力于发现和培养专家,人气最旺,淘汰率高,不自信者不要加入):

高级群I:17538442
高级群II:7120862

部份初、中级程序员群:
第三群:2650485
第五群:29537639
第四群:28702746
第六群:10590618
第七群:10543585
第八群:12006492
第九群:19063074
第十群:2883885
第十一群:25460595
第十二群:9663807

深圳程序员QQ群联盟成立2005年,拥有三十个以上的QQ群,人数超三千多人,大量高手,从业于大公司(微软、IBM,SUN,华为)、系统分析员(包括参加过上亿元的项目的架构师)。每个人都自信而上进.推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 java群: 11878667  mobile:31501597嵌入式:37489763   
—————————————————————————————————————————— 
如果你不是第一次看到此广告,说明我们最近T了一些人,因为我们要不断提升群的质量,保证名副其实.
-------------------------------------------------------------------------------------
在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到: 
      1. 通读手册,试着自己找答案。 
      2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。 
      3. 在网上搜索(个人推荐google~)。 
      4. 向你身边精于此道的朋友打听。 
我想我们首先应该靠自己解决问题,然后才是问
------------------------------------------------------------------------------------------------------

技术QQ群是一个体现群体智慧的地方,无价值的发言会给别人带来噪音和负担,如果不同意以上观点的请勿加入!

*****************************************************************************

#34


学习了 写得很明白

#35


记号

#36


路过学习!!!!

#37


mark

#38


// 限定条件
(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)

请问一下,这种表达式在validation.xml里不适用?

#39


路过~

#40


该回复于2009-06-26 09:23:26被版主删除

#41


Marked by Bigbug9002

#42


顶!

#43


mark 下。。。睡觉了

#44


全是高手高手啊……

#45


nice job!!

#46


开始学习正则表达式

#47


学习了~~~

#48


顶!!!!!!!!1

#49


我去!这么老的贴啊!

#50


回复。