身份证Java正则简单判断:15或18位纯数字,或者17位数字+X或x结尾。(严格时需要验证省份)。
boolean isIdcard = str.matches("(^\\d{15}$)|(^\\d{17}(\\d|X|x)$)");
手机号码Java正则简单判断:1开头,第二位3-9,后面9位数字
boolean isPhone = str.matches("^[1][3-9][0-9]{9}$");
不用看很多, 就说两个个比较有用,但是可能见得不多的String类方法,需要配合正则表达式使用。
1. match()方法:
如 String str = "123456";
我想要判断该字符串是不是全数字
可以用: str.match("\\d+") ; 此处可知道结果返回为true。如果不是全为数字就返回为false。
同理用作判断字符串是不是满足邮箱,身份证,是否满足一定格式等。
2. replaceFirst() / replaceAll()方法:
如 String str = "1a23a45a67";
我想拿到字符串中两个字符a之间的内容,也就是中间的23a45
可以用: str.replaceFirst("[^a]*a(.+)a.*","$1"); 此时返回的结果即为 23a45。
又比如 String str = "ab123cd";
想到到字符串中的数字,即中间的123,
可以用: str.replaceFirst("\\D*(\\d+)\\D*","$1"); 此时返回的结果即为 123。
同理可用该方法拿到字符串中的任意需要的内容。
又比如 String str = "!you good!";
想要去除最初的字符和最后的字符,,
可以用: str.replaceFirst(".(.+).","$1"); 此时返回的结果即为 you good
另外String可以配合正则类,做一些其他的处理。只要你想得到,就能做到。
String str = "This is my small example string which I'm going to use for pattern matching.";
Pattern pattern = Pattern.compile("\\w+"); //可加参数 Pattern.CASE_INSENSITIVE 忽略大小写
Matcher matcher = pattern.matcher(str);
StringBuilder sb = new StringBuilder();
// 检查所有的结果
while (matcher.find()) {
System.out.print("index: " + matcher.start() + "-" + matcher.end() + " ");
System.out.println(matcher.group());
sb.append(matcher.group()+"_");
}
System.err.println(sb.toString());
// 现在创建一个新的pattern和Matcher 以用选项卡替换空格s
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(str);
System.out.println(matcher2.replaceAll("\t"));
又比如 String str = "hdsjhf$jks${acd},${cdsa}";
要取${}中的值,可以用下列正则;
String str = "hdsjhf$jks${acd},${cdsa}";
Pattern pattern = Pattern.compile("\\$\\{\\w+\\}"); //可加参数 Pattern.CASE_INSENSITIVE 忽略大小写
Matcher matcher = pattern.matcher(str);
StringBuilder sb = new StringBuilder();
// 检查所有的结果
while (matcher.find()) {
System.out.print("index: " + matcher.start() + "-" + matcher.end() + " ");
System.out.println(matcher.group());
sb.append(matcher.group()+"_");
}
System.err.println(sb.toString());
一、String 类构造方法:
1. String s = "abc";
2. String s = new String(); //单纯的String对象。
3. byte[] b = {65,97,99}; //65='A',97='a',65+25='Z',97+25='z',48='0',48+9='9'
String s = new String(b); // s = "Aac" ,会根据byte[]中的ASCLL码拿到对应值。
String s = new String(b,0,2); // s = "Aa",只取b[0]、b[1]。2不包含。可以是int[]
4. char[] c = {65,'b','c','我'}; // 可以将char[]作为参数. 'a' = (byte)65
String s = new String(c); // s = "abc" ,因为65对应为'a'
String s = new String(c,1,2); // s = "bc",2是包含的。为a[1]、a[2].与byte不同
5. String s = new String(String original);
String s = new String(StringBuffer buffer);
String s = new String(StringBuilder builder);
6. byte[] b = {65,65+32,48};
Charset c = Charset.forName("gbk"); //编码集两种创建方法: = Charset.defaultCharset();
String s = new String(b,c); //输出为 "Aa0"。编码集貌似并没有什么卵用。
二、String 类的相关方法:
String s = "abc123ABC";
1. s.equals(Object obj); // 直接比较。boolean
2. s.length(); // 返回字符串长度。\r或\n也算一个长度。int
3. s.equalsIgnoreCase(Object obj); //忽略大小写比较。boolean
4. s.substring(0, 3); //截取索引为0-2的字符串,不包括3. String
s.substring(2); //截取索引为2之后的所有字符。 c123ABC。 String
5. s.getBytes(); //返回字符串中每个字符的byte值。如返回的b[0]=97. byte[]
6. s.charAt(2); //返回索引为2的字符;"c" 。 String
7. s.codePointAt(0); //返回索引为0的字符的ASCLL码。"a" = 97. int
s.codePointBefore(1) //返回指定下标之前的一个字符的ASCLL。所以>1。此处97.int
8. s.compareTo("b"); //比较ASCLL。s.ASCII > "b".ASCII ? 正数: 0 or 负数
9. s.concat("000"); //在s的基础上加上"000". String
10. s.contains("xxx"); //是否包含xxx。 boolean
11. s.endswith("xxx"); //是否以xxx结尾。boolean
s.startWith("xxx"); //是否以xxx开头。boolean
12. s.indexOf("b"); //返回"b"在s中第一次出现的下标索引。如此处:1。没有就-1. int
s.indexOf("b",2) //如果下标2之后没有"b",返回-1.如果有就返回"b"在整个s中的下标。
s.lastIndexOf("a") //返回s中"a"最后出现时的下标。 没有就返回-1。 int
s.lastIndexOf("a",4) //返回s中下标0-4(包括)中最后一次出现"a"的下标。int
13. s.trim(); //除去字符串s两边的空格。 String
14. s.isEmpty(); //在 s = ""; 的情况下为真返回true。若s=null,会有空指针异常。boolean
15. s.intern(); //"d" == new String("d").intern().若池已经有此字符串,则返回池中的字符串。否则,将此 String 对象添加到池中。
16. s.matches("regex"); //判断s是否符合正则表达式"regex",符合,返回true。很不错的方法!
17. String s1= “tsinghua”
String s2=“it is TsingHua”;
s1.regionMatches(0,s2,6,7); //regionMatches(s1.int,与s2,的6,共比较7个字符)
//最后一个语句表示将s1字符串从第0个字符“t”开始和s2字符串的第6个字符“T”开始逐个比较,共比较7对字符,由于区分大小写,所以结果为false。
//但如果最后一个语句改为:
s1.regionMatches(true,0,s2,6,7); //没什么卵用. boolean
//则结果为true,因为入口参数中true表示忽略大小写区别。
18. String.valueOf(obj|char[]); //将obj转为字符串。如将数值变为字符串。 String
19. s.copyValueOf(char[]|char[],int,int); //将数组转为字符串s。而没有新建对象。
20. s.replace(oldStr,newStr); //将s中的oldStr用newStr代替并返回新字符串。String
21. s.replaceAll("regex","newStr"); //可以用正则匹配某些字符,然后用newStr替换
s.replaceAll("(\\w+)regex(\\w+)","$1 $2") //可以用正则匹配某些字符,然后拿到这些字符。非常有用!谁用谁知道
22. s.replaceFirst("regex","newStr"); //用正则匹配某些字符,然后用newStr替换一次
s.replaceFirst("regex(\\w+)","$1") //用正则匹配某些字符,然后拿到这些字符
23. String.join("_","hello","world"); //用第一个参数'_'将hello与world连接起来。多个都行。String
String.join("_",list); //用左边的'_'将集合中的元素连接起来。 返回String.
24. String.format("the answer:%s", str);//用str代替左边的 %s; 左边%s个数=右边变量个数。
25. s.split("a"); //返回一个String数组。此处s.split("a")[0]="",..[1]="b",..[2]="c",..[3]="123ABC"
s.split("a|A"); //通过“a”或者"A"切割。
s.spilt("a",2); // 只分割成两段。 s.spilt("a",2)[0]="", s.spilt("a",2)[1]="baca123ABC"
下面这些一般都不会用到。
String.format("结果是:% d", 31);//结果是:& &31 //正值前面加空格。负不加。
String.format("结果是:%3d", 31);//结果是:31& & //& &代表一个空格
String.format("结果是:%,d", 3100);//结果是:3,100 //,是3位数字多一个逗号
String.format("结果是:%,6d", 3100);//结果是:& &3,100 //不够宽度左边补空格
String.format("结果是:%,-6d", 3100);//结果是:3,100& & //加-后居左,空格补右
String.format("结果是:%,+-7d", 3100) // +3,100& & //如果7d前没有-,空格在左边
String.format("结果是:%,07d", 3100) //003,100 //结果用0填充
String.format("结果是:%(d", -31);//结果是:(31) //负数用括号括起来。不显示-
String.format("结果是:%#o", 31);//结果是:037 //o:8进制,x:16进制 。3*8+7=31
String.format("结果是:%2$3d", 31,41); //结果是:& &41
String.format("结果是:%1$3d%2$ ,d", 3100,4100); //结果是:3100 4,100
还有Java String相关的面试题: