// 限定条件
final String CONDITION = "(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)"; // 允许出现的字符
final String SPECIAL_CHAR = "[-A-Za-z0-9!$%&()/;<?{}\\[\\]^\\\\]"; // 数量
final String QUANTITY = "{8,16}";2,3 都好理解,第一个理解不了,能否详细介绍一下呢。明天加分到200.拜托了。
final String CONDITION = "(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)"; // 允许出现的字符
final String SPECIAL_CHAR = "[-A-Za-z0-9!$%&()/;<?{}\\[\\]^\\\\]"; // 数量
final String QUANTITY = "{8,16}";2,3 都好理解,第一个理解不了,能否详细介绍一下呢。明天加分到200.拜托了。
楼主【tteesstt】截止到2008-07-16 22:55:55的历史汇总数据(不包括此帖):
发帖的总数量:111 发帖的总分数:7300 每贴平均分数:65
回帖的总数量:78 得分贴总数量:8 回帖的得分率:10%
结贴的总数量:111 结贴的总分数:7300
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
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 三个条件,也就是说
必后面必须出现至少一个小写字母、至少一个大写母、至少一个数字。
如果改成 [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] 这样。
XP 与 NT,位置和顺序都是无关的(这主要是 .* 的作用)。当然了这个表达式的效
率是比较低的,得向后进行两次断言。 如果字符串是 WincbaXPabcNT 这个字符串,当匹配指示器走到 n 后面的缝隙时开始
进行向后断言,首先对 .*XP 进行断言,很明显能将 cbaXP 匹配成功,这时第一个断
言完成,再对 .*NT 断言,可以看出 cbaXPabcNT 能与其匹配成功,这时第二个断言完
成,因此表达式 Win(?=.*XP)(?=.*NT) 能对 WincbaXPabcNT 进行匹配。 同理 WincbaNTabcXP 也是同样的效果。 如果能理解上面的这些,对于 (?=.*[a-z])(?=.*[A-Z])(?=.*\\d) 这个的理应该不会
很难吧,这个只不过是必须同时满足三个条件。 这个表达式在开始部分就进行断言,即索引为 0 的地方,也就是第一个字符的前面的
缝隙,这个缝隙后面的字符必须满足 .*[a-z] .*[A-Z] .*\\d 三个条件,也就是说
必后面必须出现至少一个小写字母、至少一个大写母、至少一个数字。
更多的学习资料提供给广大的IT朋友们
程序员在深圳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群是一个体现群体智慧的地方,无价值的发言会给别人带来噪音和负担,如果不同意以上观点的请勿加入!*****************************************************************************
(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)请问一下,这种表达式在validation.xml里不适用?