⼀、概念
正则表达式,⼜称规则表达式
。
(英语:
Regular Expression
,在代码中常简写为
regex
、
regexp
或
RE
),计算
机科学的⼀个概念。正则表达式通常被⽤来检索、替换那些符合某个模式
(
规则
)
的⽂本。在众多语⾔中都可以⽀持
正则表达式,如
Perl
、
PHP
、
Java
、
Python
、
Ruby
等。当然在
Java
中也可以通过处理字符串的⽅式达到检索,替换
⽂本字符串的⽬的,但是有了正则表达式写代码更加简洁,通常两三⾏代码就可以达到⽬的,当然这也是建⽴在熟
悉正则表达式的基础之上的。
⼆、正则表达式的规则
\1.
任意⼀个字符表示匹配任意对应的字符,如
a
匹配
a
,
7
匹配
7
,
-
匹配
-
。
\2. []
代表匹配中括号中其中任⼀个字符,如
[abc]
匹配
a
或
b
或
c
。
\3. -
在中括号⾥⾯和外⾯代表含义不同,如在外时,就匹配
-
,如果在中括号内
[a-z]
表示匹配
26
个⼩写字⺟中的任⼀
个;
[a-zA-Z]
匹配⼤⼩写共
52
个字⺟中任⼀个;
[0-9]
匹配⼗个数字中任⼀个。
\4. ^
在中括号⾥⾯和外⾯含义不同,如在外时,就表示开头,如
^7[0-9]
表示匹配开头是
7
的,且第⼆位是任⼀数字
的字符串;如果在中括号⾥⾯,表示除了这个字符之外的任意字符
(
包括数字,特殊字符
)
,如
[^abc]
表示匹配出去
abc
之外的其他任⼀字符。
\5. .
表示匹配任意的字符。
\6. \d
表示数字。
\7. \D
表示⾮数字。
\8. \s
表示由空字符组成,
[ \t\n\r\x\f]
。
\9. \S
表示由⾮空字符组成,
[^\s]
。
\10. \w
表示字⺟、数字、下划线,
[a-zA-Z0-9_]
。
\11. \W
表示不是由字⺟、数字、下划线组成。
\12. ?:
表示出现
0
次或
1
次。
\13. +
表示出现
1
次或多次。
\14. *
表示出现
0
次、
1
次或多次。
\15. {n}
表示出现
n
次。
\16. {n,m}
表示出现
n~m
次。
\17. {n,}
表示出现
n
次或
n
次以上。
\18. XY
表示
X
后⾯跟着
Y
,这⾥
X
和
Y
分别是正则表达式的⼀部分。
\19. X|Y
表示
X
或
Y
,⽐如
"food|f"
匹配的是
foo
(
d
或
f
),⽽
"(food)|f"
匹配的是
food
或
f
。
\20. (X)
⼦表达式,将
X
看做是⼀个整体。
⼆、
Java
中如何写正则表达式
在
java
中调⽤正则表达式的类是
java.util.regex.Matcher
和
java.util.regex.Pattern
,
java.util.regex
包是从
jdk1.4
开
始提供的。有多种写法来使⽤正则表达式。
\1.
仅仅是匹配
1).
实现⽅式
1
,匹配⼀个数字。
public void regex1() {
//
要匹配的字符
String str = "8";
//
正则表达式
String regex = "[0-9]";
//
返回匹配的结果,匹配成功就返回
true
,失败就返回
false
,此次匹配返回
true
。
boolean flag = Pattern.matches(regex, str);
System.out.println(flag);
}
2).
实现⽅式
2,
匹配
3
个到
5
个字⺟,⼤⼩写不限,包括
3
和
5
个。
public void regex2() {
//
要匹配的字符
String str = "hello";
//
正则表达式
String regex = "[a-zA-Z]{3,5}";
//
输出匹配的结果
,
此次匹配返回
true
。
System.out.println(str.matches(regex));
}
3).
实现⽅式
3(
此种实现⽅式最快
)
, 匹配
11
位的电话号码,匹配规则:第⼀个数字是
1
,第⼆个数字是
2,3,7,8
中任
⼀个,后⾯
9
位数字中不包含
4
。
public
void
regex3
() {
•
//
要匹配的字符
•
String
str
=
"13656231253"
;
•
//
正则表达式
•
String
regex
=
"1[2378][0-35-9]{9}"
;
•
//
将给定的正则表达式编译为模式。 如果匹配需求较多,且需⽤同相同的
regex
去匹配,就可将这句写到静态
模块⾥⾯,⽤的时候直接使⽤实例
p
•
Pattern p
=
Pattern
.
compile
(
regex
);
•
//
创建⼀个匹配器,匹配给定的输⼊与此模式。
•
Matcher m
=
p
.
matcher
(
str
);
•
//
尝试将整个区域与模式进⾏匹配。
•
boolean
flag
=
m
.
matches
();
•
//
输出匹配结果,此次结果为
true
•
System
.
out
.
println
(
flag
);
•
}
\2.
替换。
public void regexReplace () {
//
要匹配的字符
String str = "12a6B985Ccv65";
//
正则表达式
String regex = "[a-zA-Z]+";
//
正则表达式
String regex2 = "\d+";
//
将字符串中英⽂字⺟替换为
&
符号,输出
12&6&985&65
System.out.println(str.replaceAll(regex, "&"));
//
将字符串中单个数字或者连续的数字替换为
0
,输出
0a0B0Ccv0
System.out.println(str.replaceAll(regex2,"0"));
}
\3.
切割,根据⼤写字⺟切割字符串。
public void outputStr() {
String str = "oneTtowTthreeDfourJfive";
String regex = "[A-Z]";
String[] arr = str.split(regex);
for (String s: arr) {
System.out.print(s + " ");
}
}
输出:
one tow three four five