您当前的位置: 首页 >  正则表达式

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第六章 字符串、正则表达式

梁云亮 发布时间:2022-03-07 13:08:36 ,浏览量:3

6.1 String

不可变的字符串对象,尽量少使用+=操作

  • 字符串转换符号为 \

  • 一.常见的转义字符

转移字符对应的英文是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+",""));
    		
    
    	}
    
    }
    
    
6.2 StringBuilder、StringBuffer

它们都是可变字符串,使用上功能上基本一样,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
} }
作业
  1. 要求实现字符逆序。
  2. 判断字符出现次数
  3. 描述一下String、StringBuilder、StringBuffer的区别?
  4. 将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔
  5. 随机生成指定长度的密码或指定长度的验证码字符串。
  6. 查询身份证号归属地,查询ip所有地

image-20210113094928775

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("未知错误异常");
		}
	}
}

image-20210115145837917

  1. 注册项目时,用户的姓名要么是全中文,要么是全英文,不能其它符号,不可以使用混合。
  2. 姓名是张三丰,显示 张*丰,手机号: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");
		}
	}

}

  1. 在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();
		}
	}

}

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0418s