java正则表达式:你的字符串好搭档
- 本文基于python正则表达式的初步学习基础,进一步加深在Java程序设计中正则表达式的使用语法和规则,体会两者之间的联系与差异。
- Question:什么是正则表达式?
- 情境导入:有一天QQ邮箱需要验证你的个人信息,请你输入正确的邮箱格式;若输入格式不对则会报错,并提示需含有多少位的数字及字符。
- 课本理解:正则表达式(regular expression)简写regex,是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具,使用正则表达式可以来匹配、替换和拆分字符串。
- 正则表达式的匹配规则(自制表格汇总):
. | 匹配除换行符所有单个字符 |
^regex | 正则必须匹配字符串开头 |
regex$ | 正则必须匹配字符串结尾 |
[abc] | 匹配字母abc其中之一 |
[abc][de] | 匹配a或b或c,其后跟着d或e |
[^abc] | 当符号^出现在中括号开头时,表示否定模式,即匹配除a或b或c以外的所有字符 |
[^a-z] | 匹配除了a-z所有任意字符 |
[a-z0-9] | 表示匹配范围,匹配字母范围为a-z,数字范围为0-9,但不匹配z0 |
X | 指定字符X |
XZ | 匹配X后接着Z |
(X|Z) | 匹配X或Z |
[a-e[m-p]] | 匹配a-e或者m-p |
[a-e&&[m-p]] | 匹配a-e和m-p的交集 |
\d | 匹配一位数字,等同于[0-9] |
\D | 匹配一位非数字 |
\w | 匹配单词字符,等同于[a-zA-Z0-9_]字母数字下划线 |
\W | 非单词字符 |
\S | 非空白字符 |
\s | 空白字符(空格或tab键) |
P* | 出现0次或多次p |
P+ | 出现1次或多次p |
P? | 0次或者一次出现p |
P{n} | 正好出现n次p |
P{n,} | 至少出现n次p |
P{n,m} | n-m次出现p |
\p{P} | 一个标点字符 |
注意:导入Java的两个与正则表达式相关的pack
import java.util.regex.Matcher;
import java.util.regex.Pattern;
注意:可以用括号来将模式进行分组,如(ab){3}匹配ababab,而ab{3}则匹配abbb
注意:equals和matches的方法有区别,matches的功能更强大,它不仅可以匹配一个固定的字符串,而且可以匹配符合一个模式的字符串集合
注意:使用正则表达式也要注意转义字符“\”,匹配时具体格式例如为[\\d],匹配\\时要用\\\\.括号符在正则表达式中是特殊字符,对于模式分组,为了在表达式中表达字面值或者,必须使用\\或\\(和\\).
例如匹配(xxx)xxx-xxx,其中x为一位数字,regex表示为\\([0-9][\\d]\\)[\\d]{3}-[\\d]{3}
注意:使用“^”符号时,注意[^abc]表示不与括号内任意一项匹配,而“^\\.*”字符串中表示匹配开头内容.
运行实例:
- “Java is fun”.matches(“Java*”),字符串.*匹配0或者多个任意字符
- 某密码格式为xxx—xx—xxx,其中x为一位数字,则用正则表达式可表示为
[\\d]{3}-[\\d]{2}-[\\d]{3}
- 详细分析:^\d+(\.\d+)?
^表示模式必须匹配字符串的开头
d+表示匹配一个或多个数字
?表示括号里的语句是可选的
\.匹配符号.
小括号表示分组
综上分析,可匹配例如“5”,“5.2”,“5.48”等等
4.
以下为一个完整的测试案例:
我们首先创建了一个字符串str
,然后使用Pattern
和Matcher
类来进行正则匹配。我们分别使用^He
和d!$
来匹配字符串的开头和结尾,最后输出匹配结果。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
public static void main(String[] args) {
String str = "Hello, World!";
// 匹配字符串的开始
Pattern patternStart = Pattern.compile("^He");
Matcher matcherStart = patternStart.matcher(str);
if (matcherStart.find()) {
System.out.println("字符串以'He'开头");
} else {
System.out.println("字符串不以'He'开头");
}
// 匹配字符串的结束
Pattern patternEnd = Pattern.compile("d!$");
Matcher matcherEnd = patternEnd.matcher(str);
if (matcherEnd.find()) {
System.out.println("字符串以'd!'结尾");
} else {
System.out.println("字符串不以'd!'结尾");
}
}
}
5. 检测是不是QQ号(6位及20位之内,0不能在开头,必须全部是数字):
public class Main {
public static void main(String[] args) {
//[]是或,{}是重复次数
String qq = "1234567890";//示例
System.out.println(qq.matches("[1-9]\\d{5,19}"));
}
}
6. 判断字符串是否为手机号码。 手机号码规则:以1开头,第二位是3/4/5/7/8之一,后面跟着9位数字。
public class Main {
public static void main(String[] args) {
String phone1 = "13812345678";
String phone2 = "12345678900";
System.out.println("phone1是否为手机号码:" + phone1.matches("1[34578]\\d{9}"));
System.out.println("phone2是否为手机号码:" + phone2.matches("1[34578]\\d{9}"));
}//字符串类型,不变的固定,变化的用正则表达式,准确把握[]和{}的含义
}
7. 验证字符串是否以 “http://” 开头,并且以“.com” 结尾。
public class Main {
public static void main(String[] args) {
String email = "http://www.example.com";
if (email.matches("^http://.*\\.com$")) {
System.out.println("字符串是有效的电子邮件地址");
} else {
System.out.println("字符串不是有效的电子邮件地址");
}
}
}