对正则表达式定义的初步理解:
从中文来看“正则表达式”感觉很不好理解,但是从英文定义来看,“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