java正则表达式初了解

对正则表达式定义的初步理解:

从中文来看“正则表达式”感觉很不好理解,但是从英文定义来看,“regular expression”,有规律的表达式,这样我们也许就能够猜测到一些。正则表达式本质仍旧是一个字符串,由很多字符构成,去描述一个符合它要求的字符串模式。可以使用正则表达式来匹配、替换和拆分字符串。(现在看不懂没关系!结合下面正则表达式的使用例子就能理解了)

一些正则表达式的用法

正则表达式是由字面值字符和特殊符号组成

1.检查是否匹配

1> X:指定字符X

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		String str = input.nextLine();
		System.out.println(str+": "+check(str));
	}
	
	public static boolean check(String str) {
	//此处正则表达式是指定字符Java
		boolean result = str.matches("Java");
		return result;
	}
运行结果:
Java
Java: true
java
java: false

2> .:除换行符以外的任何字符

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		while(true) {String str = input.nextLine();
		System.out.println(str+": "+check(str));}
	}
	
	public static boolean check(String str) {
		boolean result = str.matches("J..a");
		return result;
	}
运行结果:
Java
Java: true
Jaa
Jaa: false
Jeea
Jeea: true

3>(ab|cd):ab或cd

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		while(true) {String str = input.nextLine();
		System.out.println(str+": "+check(str));}
	}
	
public static boolean check(String str) {
		boolean result = str.matches("t(en|im)");
		return result;
	}
运行结果:
ten
ten: true
tim
tim: true
aen
aen: false
tan
tan: false

4> [abc]:a或b或c

public static boolean check(String str) {
		boolean result = str.matches("J[aeo]va");
		return result;
	}
Java
Java: true
Jeva
Jeva: true
Jpva
Jpva: false

5> [^abc]:除了a、b或者c外的任意字符:

public static boolean check(String str) {
		boolean result = str.matches("J[^ab]va");
		return result;
	}
运行结果:
Java
Java: false
Jbva
Jbva: false
Jiva
Jiva: true

6> [a-z]:a到z

public static boolean check(String str) {
		boolean result = str.matches("J[b-f]va");
		return result;
	}
运行结果:
Jbva
Jbva: true
Java
Java: false
Jzva
Jzva: false

7>[^a-z]:除了a到z外的任意字符

public static boolean check(String str) {
		boolean result = str.matches("J[^b-f]va");
		return result;
	}
运行结果:
Jbva
Jbva: false
Java
Java: true
Jzva
Jzva: true

8> [a-e[m-p]]:a到e或m到p

public static boolean check(String str) {
		boolean result = str.matches("J[a-e[p-q]]va");
		return result;
	}
运行结果:
Jeva
Jeva: true
Jqva
Jqva: true
Jfva
Jfva: false

9>[a-e&&[c-p]]: a到e与c到p的交集

public static boolean check(String str) {
		boolean result = str.matches("J[a-e&&[p-q]]va");
		return result;
	}
运行结果:
Jeva
Jeva: false
Jqva
Jqva: false
Jfva
Jfva: false

10> \d:一位数字,等同于[0-9]

public static boolean check(String str) {
		boolean result = str.matches("ZYL041\\d");
		return result;
	}
运行结果:
ZYL0416
ZYL0416: true
ZYL041q
ZYL041q: false

11> \D: 一位非数字

public static boolean check(String str) {
		boolean result = str.matches("ZYL041\\D");
		return result;
	}
运行结果:
ZYL041!
ZYL041!: true
ZYL041p
ZYL041p: true
ZYL0419
ZYL0419: false

12> \w:单词字符(即任何的字母,数字或者下划线)

public static boolean check(String str) {
		boolean result = str.matches("ZY\\w0416");
		return result;
	}
运行结果:
ZYL0416
ZYL0416: true
ZY00416
ZY00416: true
ZY#0416
ZY#0416: false
ZY_0416
ZY_0416: true

13>\W:非单词字符

public static boolean check(String str) {
		boolean result = str.matches("ZY\\W0416");
		return result;
	}
运行结果:
ZYL0416
ZYL0416: false
ZY#0416
ZY#0416: true

14>\s:空白字符

public static boolean check(String str) {
		boolean result = str.matches("朱一龙\\s金鸡影帝");
		return result;
	}
运行结果:
朱一龙 金鸡影帝
朱一龙 金鸡影帝: true
朱一龙<金鸡影帝
朱一龙<金鸡影帝: false

15>\S:非空白字符

public static boolean check(String str) {
		boolean result = str.matches("朱一龙\\S金鸡影帝");
		return result;
	}
运行结果:
朱一龙是金鸡影帝
朱一龙是金鸡影帝: true

16> p*:0或者多次出现模式p

public static boolean check(String str) {
		boolean result = str.matches("(朱一龙未来可期)*");
		return result;
	}
运行结果:
朱一龙未来可期朱一龙未来可期
朱一龙未来可期朱一龙未来可期: true
朱一龙未来可期
朱一龙未来可期: true

17>p+:1次或多次出现模式p

public static boolean check(String str) {
		boolean result = str.matches("(123)+");
		return result;
	}
运行结果:
123
123: true

: false

18>p?:0次或者1次出现模式p

public static boolean check(String str) {
		boolean result = str.matches("(123)?");
		return result;
	}
运行结果:
123123
123123: false
123
123: true

19>p{n}:出现n次模式p

public static boolean check(String str) {
		boolean result = str.matches("(好好生活){3}");
		return result;
	}
运行结果:
好好生活好好生活好好生活
好好生活好好生活好好生活: true
好好生活
好好生活: false

20>p{n,}:至少出现n次模式p

public static boolean check(String str) {
		boolean result = str.matches("消失的她票房大卖!{3,}");
		return result;
	}
运行结果:
消失的她票房大卖!!!
消失的她票房大卖!!!: true
消失的她票房大卖!!!!!!!!!!!
消失的她票房大卖!!!!!!!!!!!: true

21> p{n,m}:出现n到m次模式p

public static boolean check(String str) {
		boolean result = str.matches("123{2,4}");
		return result;
	}
运行结果:
123
123: false
1233
1233: true
12333
12333: true
123333
123333: true
1233333
1233333: false

22> \p{P}:一个标点字符:! " # $ & ’ () * + - , . / ; : < = > ? @ [ ] \ ^ - { } | ~

public static boolean check(String str) {
		boolean result = str.matches("123\\p{P}");
		return result;
	}
运行结果:
1233
1233: false
123@
123@: true

tip: 第16点到第21点的符号称作量词符,用于确定量词符前面的模式会重复多少次。不能在量词符中使用空白
tip: 可以使用括号来将模式进行分组。比如,(ab){3}匹配ababab,ab{3}匹配abbb

2. 替换和拆分字符串

String类包含replaceAll、replaceFirst、split方法,用于替换和拆分字符串。

replaceAll方法替换所有匹配的子字符串,replaceFirst方法替换第一个匹配的子字符串。

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Java Java Java".replaceAll("v\\w","lo"));
	}
运行结果:
Jalo Jalo Jalo

tip:在默认情况下,所有量词符都是贪婪的,也就是它们会尽可能匹配最多次。比如下面第一个匹配成功的是aaaa:

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Jaaaavaa".replaceFirst("a+","R"));
	}
运行结果:
JRvaa

如果在后面添加?,可以改变量词符的默认行为,量词符变为惰性的,也就是将匹配尽可能少的次数。比如下面第一个匹配成功的是a:

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Jaaaavaa".replaceFirst("a+?","R"));
	}
运行结果:
JRaaavaa

split方法:(两个重载方法)

split(regex: String):使用匹配的分隔符将一个字符串拆分为子字符串

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] tokens = "Java1HTML2PERL".split("\\d");
		for(String e: tokens) {
			System.out.println(e);
		}
	}
运行结果:
Java
HTML
PERL

split(regex:String,limit:int) :limit 参数确定模式匹配多少次,如果limit<=0,split(regex,limit)等同于split(regex)。如果limit>0,模式最多匹配limit-1次。

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] tokens = "Java1HTML2PERL".split("\\d",0);
		for(String e: tokens) {
			System.out.println(e);
		}
	}
运行结果:
Java
HTML
PERL

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] tokens = "Java1HTML2PERL".split("\\d",1);
		for(String e: tokens) {
			System.out.println(e);
		}
	}
运行结果:
Java1HTML2PERL

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] tokens = "Java1HTML2PERL".split("\\d",2);
		for(String e: tokens) {
			System.out.println(e);
		}
	}
运行结果:
Java
HTML2PERL

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] tokens = "Java1HTML2PERL".split("\\d",4);
		for(String e: tokens) {
			System.out.println(e);
		}
	}
运行结果:
Java
HTML
PERL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值