不可变的字符串对象,尽量少使用+=操作
-
字符串转换符号为 \
-
一.常见的转义字符
转移字符对应的英文是escape character , 转义字符串(Escape Sequence)
字母前面加上捺斜线""来表示常见的那些不能显示的ASCII字符.称为转义字符.如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。
所有的转义字符和所对应的意义:
转义字符意义ASCII码值(十进制)\b退格(BS) ,将当前位置移到前一列008\f换页(FF),将当前位置移到下页开头012\n换行(LF) ,将当前位置移到下一行开头010\r回车(CR) ,将当前位置移到本行开头013\t水平制表(HT) (跳到下一个TAB位置)009\v垂直制表(VT)011\代表一个反斜线字符’’'092’代表一个单引号(撇号)字符039"代表一个双引号字符034\0空字符(NULL)000\ddd1到3位八进制数所代表的任意字符三位八进制\uhhhh1到2位十六进制所代表的任意字符二位十六进制package cn.webrx;
public class Str1 {
public static void main(String[] args) {
//java.lang.String
String s = "ok";
//输出 hello 'java' "oop" \n
System.out.println("hello 'java' \"oop\" \\n");
System.out.println(s);
s += "java";
System.out.println(s);
}
}
- java15 新的字符串块
package cn.webrx;
public class Str2 {
public static void main(String[] args) {
//java 15 新的字符串
String s = """
int i = 30;
abc汉字 \n"java"
""";
System.out.println(s.length());//字符数
System.out.println(s.getBytes().length);//字节数
System.out.println(s);
}
}
-
字符串常用操作
package cn.webrx; public class Str3 { public static void main(String[] args) { var s = "ok"; String s2 = new String("ok"); System.out.println(s == s2);//false System.out.println(s.equals(s2));//true System.out.println("Java".equalsIgnoreCase("JAVA"));//true var ss = "中国河南郑州"; System.out.println(ss.length());//字数 System.out.println(ss.substring(0)); System.out.println(ss.substring(0,2)); System.out.println(ss.substring(2,4)); System.out.println(ss.charAt(2));//河 int w = 1; System.out.println("星期" + "日一二三四五六".charAt(w)); //判断 System.out.println("javascript2021".startsWith("java"));//true System.out.println("javascript2021".endsWith("21"));//true System.out.println("javascript2021".contains("java"));//true System.out.println("java".indexOf("a"));//1 System.out.println("java".lastIndexOf("a"));//3 System.out.println("java".lastIndexOf("p"));//-1 //字符串替换 System.out.println("java".replace('a', 'b')); // System.out.println("1234java2021".replaceAll("\\d+","")); } }
它们都是可变字符串,使用上功能上基本一样,StringBuilder不支持多线程(非线程安全),它们都支持动态修改。
6.3 正则表达式正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
正则表达式实例
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 “Hello World” 字符串。
.(点号)也是一个正则表达式,它匹配任何一个字符如:“a” 或 “1”
String 支持正则表达式方法
.replaceAll()
.split()
// 判断是不是手机号
String phone = "13014577066";
String pattern = "^1[3,5,8]\\d{9}$";
if (phone.matches(pattern)) {
System.out.println("yes");
} else {
System.out.printf("手机号:%s不是合法的手机号。 \n", phone);
}
// 判断是不是纯中文
String name = "jack";
String p = "^[\u4e00-\u9fa5]+$";
if (name.matches(p)) {
System.out.println(name);
} else {
System.out.println("姓名必须为纯中文");
}
java.util.regex 包主要包括以下三个类:
Pattern **类:**pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher **类:**Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
**PatternSyntaxException:**PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
-
正则表达式基本语法规则
字符说明实例^表达式开始$表达式结尾[3,5,8,a-z]一个符号,符号范围在3,5,8,a-z\d === [0-9]代表一位数字\d+代表1个数字,或多个数字\d{3}代表3个数字[\u4e00-\u9fa5]{2,8}代表2到8个汉字字符*代表0个或多个前边的符号[a-z]*.代表1个任意的符号str.matches("^.+$")+代表1个或多个前边的符号\\d+?代表0个或1个前边的符号 {0,1}{n}n个{n,}n个或多个{m,n}\D[^0-9]\w[a-zA-Z0-9_]\W[^a-zA-Z0-9_](|)正则表达式或,分组功能package cn.webrx; import java.util.Arrays; public class Reg4 { public static void main(String[] args) { String str = "5hell123456o java800."; // 如下方法支持表达式 // str.split(str) // str.replaceAll(str, str) // str.replaceFirst(str, str) // str.matches(str) // str.contains(str) 不支持正则表达式 // 查检字符串中有没有java System.out.println(str.matches(".*java.*"));// true System.out.println(str.contains("java"));// true 推荐使用 // 检查字符串有没有数字 System.out.println(str.matches("\\d+.*")); String ss = "java8000php123python66html5css3mysql"; String[] s2 = ss.split("\\d+"); System.out.println(Arrays.toString(s2)); System.out.println(ss.replaceAll("\\d+", "-")); System.out.println(ss.replaceFirst("[0-9]+", "")); } }
-
正则贪婪械,禁用贪婪
package cn.webrx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Reg9 {
public static void main(String[] args) {
String a = "java8php123javascript6mysql88888html5";
System.out.println(a);
System.out.println(a.replaceAll("\\d+?", "-"));//?禁用贪婪
String str = """
hellojava 15java 15java 8java 15
""";
Pattern p = Pattern.compile(".*?java.*?");
Matcher m = p.matcher(str);
while(m.find()) {
System.out.println(m.group());
}
}
}
- 正则表达式分组
package cn.webrx;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Reg10 {
public static void main(String[] args) {
String a = "java8php123javascript6mysql88888html5";
//System.out.println(a);
//System.out.println(a.replaceAll("\\d+?", "-"));//?禁用贪婪
String str = """
hellojava 15java 15java 8java 13java 162423423
""";
System.out.println(str.replaceAll("|", ""));
System.exit(0);
Pattern p = Pattern.compile("(java )(\\d+)()");
//System.out.println(str.replaceAll(p.pattern(), "$18$3"));
System.out.println(str.replaceAll("java \\d+", ""));
Matcher m = p.matcher(str);
while(m.find()) {
System.out.println(m.group().replaceAll("(.*)", "$1"));
}
//java 数字 修改为 java 8
}
}
作业
- 要求实现字符逆序。
- 判断字符出现次数
- 描述一下String、StringBuilder、StringBuffer的区别?
- 将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔
- 随机生成指定长度的密码或指定长度的验证码字符串。
- 查询身份证号归属地,查询ip所有地
package cn.exam;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
public class Ex1 {
public static void main(String[] args) {
String id = "511181200109256813";
String u = "https://qq.ip138.com/idsearch/index.asp?userid=" + id + "&action=idcard";
System.out.println(id);
try {
String t = Jsoup.connect(u).get().toString();
Pattern p = Pattern.compile("[\\u4e00-\\u9fa5\\s]+?");
Pattern p2 = Pattern.compile("男|女");
Matcher m2 = p2.matcher(t);
m2.find();
System.out.println(m2.group());
Pattern p3 = Pattern.compile("\\d{4}年\\d{2}月\\d{2}日");
Matcher m3 = p3.matcher(t);
m3.find();
System.out.println(m3.group());
Matcher m = p.matcher(t);
while (m.find()) {
System.out.println(m.group().replace(" ", "").replace(" ",""));
System.out.println(m.group().replaceAll("[^\\u4e00-\\u9fa5]", ""));
}
} catch (IllegalStateException e) {
System.out.println("未找到");
} catch (IOException e) {
System.out.println("网络异常");
} catch(Exception e) {
System.out.println("未知错误异常");
}
}
}
- 注册项目时,用户的姓名要么是全中文,要么是全英文,不能其它符号,不可以使用混合。
- 姓名是张三丰,显示 张*丰,手机号:13014577033 显示的是 130****7033
package cn.webrx;
public class EX1 {
public static void main(String[] args) {
String name = "张三丰";
System.out.println(name);
System.out.println(name.replaceAll("(.).(.*)", "$1*$2"));
String phone = "13014577033";
System.out.println(phone);
System.out.println(phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
System.out.println(maskStr("李四六","#"));
System.out.println(maskStr("13014577088","#"));
}
public static String maskStr(String str, String mask) {
StringBuilder s = new StringBuilder(str);
if (str.matches("^1\\d{10}$")) {
return s.toString().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1" + mask.repeat(4) + "$2");
} else {
return s.toString().replaceAll("(.).(.*)", "$1" + mask + "$2");
}
}
}
- 在http://www.51beiyou.org/coutus.html 取出邮件地址和手机号。
package cn.webrx;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class EX1 {
public static void main(String[] args) {
String u = "http://www.51beiyou.org/coutus.html";
try {
Document doc = Jsoup.connect(u).get();
System.out.println(Jsoup.connect("http://www.baidu.com").get().title());
String str = doc.toString();
//取出所有数字
Pattern p1 = Pattern.compile("");
Matcher m1 = p1.matcher(str);
while(m1.find()) {
System.out.printf("%s %n",m1.group());
}
//获取的手机号,邮箱地址
Pattern p = Pattern.compile("\\d{11}|\\w+@[\\w,\\.]+");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}