Java基础_字符串及正则表达式

本文介绍了Java中的字符串,包括直接定义和使用String类创建字符串,以及可变字符串类StringBuffer和StringBuilder。接着详细讲解了正则表达式的概念、合法字符、预定义字符、方括号表达式和数量标识符。最后,讨论了Java中处理正则表达式的Pattern和Matcher对象,以及不同匹配模式的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串

字符串是Java中特殊的类,使用方法像一般的基本数据类型。Java没有内置的字符串类型,而是在标准Java类库中提供了一个String类来创建和操作字符串。

定义

1.直接定义

用字符串常量直接初始化一个String对象

String str = "Hello Java";

2.使用String类定义

通过String类的构造方法来创建字符串

String();// 表示一个空字符序列
String(String original);//新创建的字符串是该参数的副本
String(char[] value);//将参数中的字符数组元素全部变为字符串
String(char[] value,int offset,int count);//将参数中的字符数组元素指定位置长度的子数组变为字符串

StringBuffer,StringBuilder

StringBuffer,StringBuilder类为可变字符串类(字符串缓冲区),String被声明为final class,所有拼接字符串时候会产生很多无用的中间对象;StringBuffer为了解决大量拼接字符串时产生中间对象问题而产生,append和add方法可以将字符串添加到已有序列的末尾或指定的位置;StringBuilder为了提升性能去掉了保证线程安全的部分。

正则表达式

正则表达式(Regular Expression)在代码中常简写为regex,regexp或RE,它是计算机科学的一个概念。正则表达式时一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。

创建正则表达式就是创建一个特殊的字符串

1.合法字符

字符解释
X字符x(x 可代表任何合法的字符)
\0mnn八进制数 0mnn 所表示的字符
\xhh十六进制值 0xhh 所表示的字符
\uhhhh十六进制值 0xhhhh 所表示的 Unicode 字符
\t制表符(“\u0009”)
\n新行(换行)符(‘\u000A’)
\r回车符(‘\u000D’)
\f换页符(‘\u000C’)
\a报警(bell)符(‘\u0007’)
\eEscape 符(‘\u001B’)
\cxx 对应的的控制符。例如,\cM匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。

2.特殊字符

如果匹配特殊字符,首先需要通过\对特殊字符进行转义

特殊字符说明
$匹配一行的结尾。要匹配 $ 字符本身,请使用\$
^匹配一行的开头。要匹配 ^ 字符本身,请使用\^
()标记子表达式的开始和结束位置。要匹配这些字符,请使用\(\)
[]用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[\]
{}用于标记前面子表达式的出现频度。要匹配这些字符,请使用\{\}
*指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用\*
+指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用\+
?指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用\?
.匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用\.
\用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\\
|指定两项之间任选一项。如果要匹配字符本身,请使用|

3.预定义字符

上面的正则表达式只能匹配单个字符,需要通过预定义字符(通配符)来匹配多个字符。

预定义字符说明
.可以匹配任何字符
\d匹配 0~9 的所有数字
\D匹配非数字
\s匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S匹配所有的非空白字符
\w匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
\W匹配所有的非单词字符

预定义字符记忆方法

  • d 是 digit 的意思,代表数字。
  • s 是 space 的意思,代表空白。
  • w 是 word 的意思,代表单词。
  • d、s、w 的大写形式匹配与之相反的字符

4.方括号表达式

方括号表达式几乎能匹配任何字符,如 [\u0041-\u0056] 可匹配所有中文字符

方括号表达式说明
表示枚举例如[abc]表示 a、b、c 其中任意一个字符;[gz]表示 g、z 其中任意一个字符
表示范围:-例如[a-f]表示 a~f 范围内的任意字符;[\\u0041-\\u0056]表示十六进制字符 \u0041 到 \u0056 范围的字符。范围可以和枚举结合使用,如[a-cx-z],表示 ac、xz 范围内的任意字符
表示求否:^例如[^abc]表示非 a、b、c 的任意字符;[^a-f]表示不是 a~f 范围内的任意字符
表示“与”运算:&&例如 [a-z&&[def]]是 a~z 和 [def] 的交集,表示 d、e f[a-z&&^bc]]是 a~z 范围内的所有字符,除 b 和 c 之外 [ad-z] [a-z&&[m-p]]是 a~z 范围内的所有字符,除 m~p 范围之外的字符
表示“并”运算并运算与前面的枚举类似。例如[a-d[m-p]]表示 [a-dm-p]

正则表达式还支持圆括号,用于将多个表达式组成一个子表达式,圆括号中可以使用|。例如,正则表达式((a)|(b)|(c)用于匹配a,b,c中的其中之一

5.边界匹配符

边界匹配符说明
^行的开头
$行的结尾
\b单词的边界
\B非单词的边界
\A输入的开头
\G前一个匹配的结尾
\Z输入的结尾,仅用于最后的结束符
\z输入的结尾

6.数量标识符

贪婪模式勉强模式占用模式说明
X?X??X?+X表达式出现零次或一次
X*X*?X*+X表达式出现零次或多次
X+X+?X++X表达式出现一次或多次
X{n}X{n}?X{n}+X表达式出现 n 次
X{n,}X{n,}?X{n,}+X表达式最少出现 n 次
X{n,m}X{n,m}?X{n,m}+X表达式最少出现 n 次,最多出现 m 次
  • Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
  • Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
  • Possessive(占有模式):用加号后缀(+)表示,目前只有 Java 支持占有模式,通常比较少用

Java正则处理

Pattern对象是正则表达式编译后在内存中的表示形式,因此正则表达式字符串必须先编译成Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象,通过Matcher对象进行状态的匹配。

Pattern p = Pattern.compile("a*c");
Matcher m = p.matcher("abc");
boolean b = m.matches();

如果某个正则表达式仅需使用一次,则可以使用Pattern类的静态方法matches(),此方法自动将指定字符串编译成匿名的Pattern对象,并执行匹配。

bollean b = Pattern.matches("a*c","abc");

Pattern是不可变类,可供多个并发线程安全使用。

名称说明
find()返回目标字符串中是否包含与 Pattern 匹配的子串
group()返回上一次与 Pattern 匹配的子串
start()返回上一次与 Pattern 匹配的子串在目标字符串中的开始位置
end()返回上一次与 Pattern 匹配的子串在目标字符串中的结束位置加 1
lookingAt()返回目标字符串前面部分与 Pattern 是否匹配
matches()返回整个目标字符串与 Pattern 是否匹配
reset()将现有的 Matcher 对象应用于一个新的字符序列。
package com.henrik.string;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * <p>Title: Regex.java<p>
 * <p>Description:通过正则表达式匹配匹配电话号码 </p>
 * @author Henrik
 * @date Apr 3, 2022
 * @version 1.0
 */
public class Regex {
	public static void main(String[] args) {
		Regex regex = new Regex();
		//网络爬虫
		regex.reptile();
		//注册匹配
		regex.register();
	}

	@SuppressWarnings({ "resource", "unused" })
	private void register() {
		try {
			String regex = "0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|13[0-9]\\d{8}|15[1089]\\d{8}";
			String regex2 = "13[0-9]\\\\d{8}|15[1089]\\\\d{8}";
			Scanner scan = new Scanner(System.in);
			Pattern pattern = Pattern.compile(regex);  
			String answer = "N";
			do {
				System.out.println("请输入你的电话号码:");
				String phone = scan.next();
				Matcher matcher = pattern.matcher(phone);
				boolean bool = matcher.matches();
				if(bool) {
					System.out.println("注册成功!");
				}
				else {
					System.out.println("格式错误,是否重新输入?(Y/N 或者 y/n)");
					answer = scan.next();
				}
			}while(answer.equalsIgnoreCase("Y"));
			System.out.println("注册失败!");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	private void reptile() {
		String str = "用户1>姓名:张山,电话:13767895342,地址:花园小区;用户2>姓名:李思,电话:13523456789,地址:花园小区...";
		Pattern pattern = Pattern.compile("(137|135)\\d{8}");
		Matcher matcher = pattern.matcher(str);
		while(matcher.find()) {
			System.out.println(matcher.group());
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值