需求:
校验QQ号码
- 要求必须是5-15位数字
- 不能开头
分析:
A:键盘录入一个QQ号码
B:写一个功能实现校验
C:调用功能,输出结果
代码实现如下:
public class RegexDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
System.out.println("cheakQQ:"+checkQQ(qq));
}
/*
* 写一个功能实现校验
* 两个明确:
* 明确返回值类型:boolean
* 明确参数列表:String qq
* */
public static boolean checkQQ(String qq) {
boolean flag = true;
//校验长度
if(qq.length() >= 5 && qq.length() <= 15) {
//0不能开头
if(!qq.startsWith("0")) {
//必须是数字
char[] chs = qq.toCharArray();
for(int x = 0;x < chs.length;x++) {
char ch = chs[x];
if(!Character.isDigit(ch)) {
flag = false;
break;
}
}
}else{
flag = false;
}
}else{
flag = false;
}
return flag;
}
}
以上代码是未使用正则表达式,写起来相对有点繁琐。
怎么改进呢?
我们引入了正则表达式!那么是正则表达式呢?
它是指用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是符合一定规则的字符串。
常用的正则表达式规则有:
A:字符
- x 字符 x。举例:'a’表示字符a
- \ 反斜线字符
- \n 换行
- \r 回车
B:字符类
- [abc] a,b或者c(简单类)
- [^abc] 任何字符,除了a,b,c(否定)
- [a-zA-Z]a到z或A-Z,两头的字母包括在内(范围) [0-9]0到9的字符都包括
C:预定义字符类:
- .任何字符。我的就是.字符本身,该怎么表示呢?.
- \d 数字[0-9] \D 非数字
- \w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
- ^ 行的开头
- $ 行的结尾
- \b 单词边界 就是不是单词字符的地方 举例:hello world?haha;xixi
E:Greedy 数量词
- X? X,一次或者一次也没有
- X* X,零次或者多次
- X+ X,一次或者多次
- X{n} X,恰好n次
- X{n,} X,至少n次
- X{n,m} X,至少n次,但是不超过m次
根据以上规则,我们对QQ校验这个代码进行改进!
代码如下:
public class RegexDemo2 {
public static void main(String[] args) {
//键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
System.out.println("checkQQ:"+checkQQ(qq));
}
public static boolean checkQQ(String qq) {
//String regex = "[1-9] [0-9] {4,14}";
//public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式
//boolean flag = qq.matches(regex);
//return flag;
//return qq.matches("[1-9] [0-9] {4,14}");
return qq.matches("[1-9] \\d {4,14}");
}
}