最近项目中正在做后台校验,而后台校验也基本都是使用正则表达式校验,本文做一些粗略的总结。
1、字符串长度:.{1,10},注意有一个点在{}前,表示匹配所有。‘{}’之前一定是一个捕获组,因此如果有其他筛选要求并且限制长度则为在总捕获组的最后加上{}来限制长度。
2、如何表示不为abcd的任意一个字符:([^abcd])*,使用^表示在[]不为[]内的任意字符;注意,常有人写成([^a|b|c|d])*,[]里边的|不代表或者的意思,这里指表示|这个字符本省。
3、如何表示字符串中不含有adc或def等字符串:((?!adc)(?!def).)* ,其中adc为且的关系;这里有个小圆点的原因是:写正则表达式需要记住的一个重要原则就是正则表达式都是基于位校验的,因此如果此处我们没有小圆点来匹配位,这个正则表达式就是错误的。
4、如何表示多个限制条件:即多个限制条件且,使用多个捕获组相连接即可,即使用多个()相连。如:如何保证字符串中不存在adc、def且不存在双引号、单引号、斜杠、尖括号等,且长度保证在40位以内:((?!adc)(?!def)([^\"‘\\<])){0,40},就像之前说的{}之前需要一个大的括号来作为一个最终捕获组;
5、如何匹配包含换行符等在内的特殊字符的所有字符:我之前写的是这样的:(.|//s){1,2000},但是有一天测试居然告诉我当他真的用2000个字符来验证的时候,这个直接导致程序异常了,经过多方验证原来这是jdk的一个bug,于是只能改用([//s//S]){1,2000},这里使用一个小技巧,表示所有字符时用//s和//S代替,因为//s代表所有换行符 空格符等字符,而//S恰好有表示非换行符等,正好是一个互补关系。
时间: 2024-10-25 08:06:18