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 }