No1_6.字符串的基本操作2_Java学习笔记
1 import java.util.Scanner; 2 import java.util.regex.Pattern; 3 4 public class HelloString2 { 5 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 /******************* 9 *一、正则表达式:对输入的数据格式进行检查 10 *1.对输入的格式进行验证,页面上的一般用java 还是 js? 11 *答:一般前端做做验证,后台稍作验证即可。 12 *如果数据很关键,安全性很关键,那么后端就必须做非常完备的数据验证,而且还要采取其他一些防范措施来避免 13 *(或者确切地说减少可能性)SQL注入、跨站脚本攻击、CSRF(跨站请求伪造)、缓冲区溢出等等攻击。 14 *2.可以使用String类的matches()方法进行判断。boolean matches(String regex) 15 *3. 16 */ 17 18 //正则表达式中的元字符 19 /* 20 . 代表任意一个字符 21 \d 任何一个数字,等价于[0-9]或[0123456789] 22 \D 任何一个非数字,等价于[^0-9]或[^0123456789] 23 \w 任何一个字母(不区分大小写)、数字、下划线,等价于[0-9a-zA-Z_] 24 \W 任何一个非字母数字和下划线,等价于[^0-9a-zA-Z_] 25 \s 任何一下空白字符,等价于[\f\n\r\t\v] 26 \S 任何一下空白字符,等价于[^\f\n\r\t\v] 27 \p{Upper} 大写字母字符:[A-Z] 28 \p{Lower} 小写字母字符:[a-z] 29 \p{ASCII} 所有 ASCII:[\x00-\x7F] 30 \p{Alpha} 字母字符:[\p{Lower}\p{Upper}] 31 \p{Digit} 十进制数字:[0-9] 32 \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}] 33 \p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 34 \p{Graph} 可见字符:[\p{Alnum}\p{Punct}] 35 \p{Print} 可打印字符:[\p{Graph}\x20] 36 \p{Blank} 空格或制表符:[ \t] 37 \p{Cntrl} 控制字符:[\x00-\x1F\x7F] 38 \p{Space} 空白字符:[ \t\n\x0B\f\r] 39 \p{XDigit} 十六进制数字:[0-9a-fA-F] 40 */ 41 System.out.println("正则表达式 开始啦啦啦\n"); 42 //例一:判断指定字符是否合法,要求字符串由7个数字组成,并且第一位必须是大写字母,2~4位是小写字母,后3位是数字,输出结果。 43 System.out.println("例一:判断指定字符是否合法,要求字符串由7个数字组成,并且第一位必须是大写字母,2~4位是小写字母,后3位是数字,输出结果。"); 44 String s1="Lyqm887"; 45 String s2="hiGirl6"; 46 boolean bn1=s1.matches("\\p{Upper}\\p{Lower}\\p{Lower}\\p{Lower}\\d\\d\\d"); 47 boolean bn2=s2.matches("\\p{Upper}\\p{Lower}\\p{Lower}\\p{Lower}\\d\\d\\d"); 48 System.out.println(s1+"是合法数据吗?"+bn1); 49 System.out.println(s2+"是合法数据吗?"+bn2); 50 //正则表达式中的限定符 51 /* 52 ? 0次或1次 53 * 0次或多次 54 + 0次或多次 55 {n} 正好出现n次 56 {n,} 至少出现n次 57 {n,m} 出现n~m次 58 */ 59 //例二:例一的正则表达式简化 60 System.out.println("\n例二:例一的正则表达式简化"); 61 boolean bn3=s2.matches("\\p{Upper}\\p{Lower}{3}\\d{3}"); 62 System.out.println(s1+"是合法数据吗?"+bn3); 63 64 //例三:判断变量是否是合法的email地址 65 System.out.println("\n例三:判断变量是否是合法的email地址"); 66 String s3="yjgogjge@163.com"; 67 String s4="@163.com"; 68 String s5="yjgogjge@."; 69 String regex="\\w{1,}\\@{1}\\w{0,}\\.{1}\\w{1,}"; 70 if(s3.matches(regex)){ 71 System.out.println(s3+"是一个合法的Email地址~"); 72 } 73 if(s4.matches(regex)){ 74 System.out.println(s4+"是一个合法的Email地址~"); 75 } 76 if(s5.matches(regex)){ 77 System.out.println(s5+"是一个合法的Email地址~"); 78 } 79 //方括号中元字符的含义 80 /* 81 [abc] a、b或者 82 [^abc] a、b、c之外的任何字符 83 [a-zA-Z] a-z或A-Z的任何字符 84 [a-d[m-p]] a-d或m-p的任何字符 85 [a-z&&[def]] d、e、f 86 [a-z&&[^bc]] a-z之间不包含b、c的所有字符 87 [a-z&&[^m-p]] a-z之间不包含m-p的所有字符 88 */ 89 90 //例四:对手机号码的合法性进行验证 91 System.out.println("\n例四:对手机号码的合法性进行验证"); 92 Scanner s= new Scanner(System.in); 93 System.out.println("请输入手机号,验证一下你输入的是否合法?"); 94 //String tel1=s.nextLine(); 95 String tel1="15510168888"; 96 System.out.println(checkTel(tel1)); 97 98 //例五:验证ip地址的合法性 99 System.out.println("\n例五:验证ip地址的合法性"); 100 System.out.println("请输入IP地址,验证一下是否合法?"); 101 //String ip1=s.nextLine(); 102 String ip1="1.1.1.1"; 103 System.out.println(checkIPAdress(ip1)); 104 105 //例六:计算文章中汉字的个数 106 System.out.println("\n例六:计算文章中汉字的个数"); 107 String text="The secret of success is constancy to purpose.成功的秘诀在于对目标的忠实。不破不立,尝试改变一下自己~"; 108 int amount=0; 109 110 for(int i=0;i<text.length();i++){ 111 //System.out.println(text.charAt(i));可以获取每个字符 112 String chineseRegex="^[\u4e00-\u9fa5]{0,}$"; 113 boolean matches=Pattern.matches(chineseRegex, ""+text.charAt(i)); //有时间可以查一下patter类的用法 114 if (matches){ 115 amount++; 116 } 117 } 118 System.out.println(text+"\n上段话中中有几个汉字:"+amount); 119 120 /******************************** 121 * 二、字符串生成器 122 * StringBuilder类,是字符串一个重要的常用类,且节省程序运行时间; 123 * 初始容量是16个字符,可以自行指定初始长度 124 * 可以动态执行添加、删除、插入字符串 125 * ******************************************/ 126 //例一:通过实例对比String和StringBuilder在对字符串做更新操作时所用的时间差别 127 System.out.println("\n"); 128 System.out.println("例一:通过实例对比String和StringBuilder在对字符串做更新操作时所用的时间差别:"); 129 130 String str=""; 131 long startTime=System.currentTimeMillis(); // 定义执行操作的起始时间 132 for(long m=0;m<10000;m++){ 133 str=str+m; 134 } 135 long endTime=System.currentTimeMillis(); 136 long time=endTime-startTime; 137 System.out.println("String消耗时间是:"+time); 138 139 140 StringBuilder builder=new StringBuilder(""); 141 startTime=System.currentTimeMillis(); 142 for(long n=0;n<10000;n++){ 143 builder.append(n); 144 } 145 endTime=System.currentTimeMillis(); 146 time=endTime-startTime; 147 System.out.println("StringBuilder消耗时间是:"+time); 148 149 //例二:将参数str指定的字符串追加到字符串生成器中,可以追加任何类型哟,包括sb类型: StringBuilder.append(String str) 150 System.out.println("\n例二:将参数str指定的字符串追加到字符串生成器中"); 151 String myDream="可以做自己喜欢的做的事情~"; 152 boolean mySex=true; 153 StringBuilder builder1=new StringBuilder("My dream is "); 154 builder1.append(myDream); 155 builder1.append(mySex); 156 StringBuilder sb=new StringBuilder("\n不破不立~专心学习!!!"); 157 builder1.append(sb); 158 System.out.println("追加后builder1的值是:"+builder1); 159 160 //例三:将参数指定的字符串str添加到offset指定的位置 StringBuilder insert(int offset,String str) 161 System.out.println("\n例三:将参数指定的字符串str添加到offset指定的位置"); 162 StringBuilder sb1=new StringBuilder("I you!"); 163 sb1.insert(2, "miss"); 164 System.out.println("我又想到你了..."+sb1); 165 166 //例四:移除字符串生成器中的子字符串,从指定的start处开始,到指定的end处结束; 167 //StringBuilder.delete(int start,String end) 168 System.out.println("\n例四:移除字符串生成器中的子字符串"); 169 StringBuilder sb2=new StringBuilder("因为喜欢,你让我想成为更好的自己!"); 170 System.out.println("原字符串是:"+sb2); 171 sb2.delete(0, 5); 172 System.out.println("移除字符串后是:"+sb2); 173 174 //例五:将字符串生成器转换为字符串,转换后值不变 StringBuilder.toString() 175 System.out.println("\n例六:将字符串生成器转换为字符串"); 176 StringBuilder sb3=new StringBuilder("我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷," 177 + "\n却很少承认,真正的顺其自詹,其实是竭尽所能之后的不强求,而非两手一摊的不作为。 by瑞卡斯"); 178 String wordsLike=sb3.toString(); 179 System.out.println(wordsLike); 180 181 //例七:将汉字和字母转换成Unicode码 182 System.out.println("\n例七:将汉字和字母转换成Unicode码"); 183 String strUnicode="我想见你时,能不能不管你加不加班,想不想见我。。。好像不能呢~~~"; 184 char[] charArray=strUnicode.toCharArray(); 185 StringBuilder sb4=new StringBuilder(); 186 for(char c:charArray){ 187 sb4.append((int)c+" "); 188 } 189 System.out.println(strUnicode+"\n的Unicode码是:\n"+sb4); 190 191 192 //范例八:去掉字符串中重复的字符 193 System.out.println("\n范例八:去掉字符串中重复的字符"); 194 String s8="再见了,互相嫌弃的老同学,再见了,来不及说出的谢谢。"; 195 StringBuilder sb5=new StringBuilder(s8); 196 System.out.println("原来的字符串是:"+sb5); 197 System.out.println("原来的字符串长度是:"+sb5.length()); 198 for(int j=0;j<sb5.length();j++){ 199 for(int k=j+1;k<sb5.length();k++){ 200 if(sb5.charAt(j)==sb5.charAt(k)) 201 sb5.deleteCharAt(k); 202 } 203 } 204 System.out.println("现在的字符串是:"+sb5); 205 System.out.println("现在的字符串长度是:"+sb5.length()); 206 207 208 //经典范例九:实现字符串加密 209 //最常用的:获取字符串的字节数组,再对字节数组中的每个字符进行操作,加密;对字符串进行相反运算,解密。 210 System.out.println("\n经典范例九:实现字符串加密"); 211 String value="就像我说大海很漂亮,你却说淹死过很多人"; 212 char secret='晴'; 213 System.out.println("原字符串是:"+value); 214 String encrypt=encryption(value,secret); 215 System.out.println("加密后的字符串是:"+encrypt); 216 String uncrypt=encryption(encrypt,secret); 217 System.out.println("解密后的字符串是:"+uncrypt); 218 219 220 //经典范例十:验证字符串是否是回文:即从前往后读和从后往前读一样; 221 System.out.println("\n经典范例十:验证字符串是否是回文"); 222 //StringBuilder line=new StringBuilder("上海自来,水来自海上"); 223 String line="上海自来水来自海上"; 224 System.out.println("原始字符串是:"+line); 225 StringBuilder line2=new StringBuilder(line); 226 line2 =line2.reverse();//字符串生成器中字符反转,如果直接用StringBuffer类型的line转换,line和line2的存储长度是一样的。。。 227 /**************** 228 * 备注一下原理:StringBuffer 和StringBuilder 节省内存的原理,在于拼接字符串的时候本身的对象不变, 229 * 一直在变的是数组对象,通过不断的复制生成新的数组对象,达到拼接字符串, 230 * 而StringBuffer和StringBuilder的代码逻辑一模一样,只是StringBuffer所有的方法都加了cynchronized,所以是线程安全的。 231 */ 232 //line2=line2.append("喂~"); 233 System.out.println("返转后的字符串是:"+line2); 234 int count=0; 235 if( line.length() != line2.length()){ 236 System.out.println(line+":不是回文诗呵呵"); 237 }else{ 238 for(int y=0;y<line2.length();y++){ 239 240 if(line.charAt(y)==line2.charAt(y)){ 241 count++; 242 } 243 else{ 244 System.out.println(line+":不是回文诗"); 245 break; 246 }//分支结束 247 248 }//循环结束 249 250 }//外层分支结束 251 if(count==line.length()){ 252 System.out.println(line+":是回文诗~~~~"); 253 } 254 255 //实战开始 256 /************************ 257 * 1.创建Number类,判断字符串""中字符'i'出现了几次,并输出结果 258 * 2.去除字符串中的所有空格的方法,试着用for循环和if条件语句实现去除空格 259 * 3.在项目中创建DateAndTime类,将今天的全部信息格式化后输出,再将日期以“年-月-日”的格式输出 260 */ 261 //实战一 262 System.out.println("1.创建Number类,判断字符串\"\"中字符'i'出现了几次,并输出结果"); 263 264 265 266 } 267 268 269 /***********************以下是函数********************************/ 270 // 例四:对手机号码的合法性进行验证(前两位是13、15、18,共11位) 271 public static String checkTel(String str) { 272 String telRegex = "1[5,3,8]\\d{9}$"; 273 if (str.matches(telRegex)) { 274 return str + "\t是合法的手机号。"; 275 } else { 276 return str + "\t是非法的手机号!"; 277 } 278 } 279 // 例五:验证ip地址的合法性 280 public static String checkIPAdress(String str) 281 { 282 // String ipRegex="\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";//验证0~999之间的数字 283 String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." 284 +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." 285 +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." 286 +"(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; //验证0~255之间的数字 287 if (str.matches(ip)) { 288 return str + "\t 是合法的ip地址。"; 289 } else { 290 return str + "\t 是非法的ip地址!"; 291 } 292 293 } 294 295 public static String encryption(String value,char secret){ 296 byte[] bt=value.getBytes(); 297 for(int x=0;x<bt.length;x++){ 298 bt[x]=(byte)(bt[x]^(int)secret); 299 300 } 301 return new String(bt,0,bt.length); 302 } 303 304 305 306 307 }