验证qq号码是否符合规则
1.必须是5-10位
2.0不可以作为qq号的开头
package com.sxt.regexdemo;
import java.util.Scanner;
public class RegexDemo01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个QQ号:");
String qq = input.next();
if (checkQQByRegex(qq)) {
System.out.println("合法QQ");
} else {
System.out.println("非法QQ");
}
}
public static boolean checkQQ(String qq) {
boolean flag = true;
// 保证5-10位
if (qq.length() >= 5 && qq.length() <= 10) {
// 保证不是0开头
if (!qq.startsWith("0")) {
// 保证是数字
char[] chs = qq.toCharArray();
for (int i = 0; i < chs.length; i++) {
char c = chs[i];
if (!(c >= '0' && c <= '9')) {
flag = false;
break;
}
}
} else {
flag = false;
}
} else {
flag = false;
}
return flag;
}
public static boolean checkQQByRegex(String qq) {
return qq.matches("[1-9]\\d{4,9}");
}
}
正则表达式:
-
正则表达式的规则
-
概念: 使用单个字符串来描述/匹配一系列符合某个语法规则的字符串
-
在Java里面来学习正则表达式的目
-
主要就是使用正则表达式来处理字符串复杂的查找 find/替换replace/匹配matches/分割split工作
-
boolean matches(String regex) 匹配matches
-
String replaceFirst(String regex, String replacement) 替换replace
-
String replaceAll(String regex, String replacement) 替换replace
-
String[] split(String regex) 分割split工作
-
String[] split(String regex, int limit) 分割split工作
-
Pattern 正则表达式类
-
Matcher 匹配器类 查找 find
-
使用步骤
-
1.通过大量的字符串找规律定义规则
-
2.使用这种规则去匹配新的字符串
-
3.匹配成功作出相应的操作(匹配 查找 替换 分割)
-
正则表达式由两种基本字符组成
原义字符:字符本身就是一个正则表达式,例如 a, b, c ,\t ,\n ,\r ,\f等等
元字符: * + ? $ ^ () [] {}等等对正则表达式进行分类
字符类: [abc] 将字符进行归类,可以出现[]中的其中一个 对abc其中一个进行匹配
范围类:
[a-z] 表示代表a-z中的一个字符
表示所有的英文字母和数字 [a-zA-Z0-9]
预定义类:
\d == [0-9] 数字
\D == [^0-9] 非数字
空白字符:[ \t\n\x0B\f\r] == \s[^ \t\n\x0B\f\r] == \S [a-zA-Z0-9] \w [^a-zA-Z0-9] \W . 任何字符(与行结束符可能匹配也可能不匹配)
边界字符
^:以XXX开头
例如以a开头 ^a
: 以 X X X 结 尾 例 如 以 b 结 尾 b :以XXX结尾 例如以b结尾 b :以XXX结尾例如以b结尾b
\b:单词边界: 连续数字和字母的两边
\B:非单词边界量词
?:出现0次或者1次
a?
+:出现1次或者多次
a+
:出现任意次
a
{n}:出现正好n次
a{4}
{n,m}出现n-m次
a{2,6}
{n,}出现至少n次
a{3,}
分组 ()
如何让Jack出现至少3次,而不是k出现三次
错误写法 Jack{3,}
使用分组的正确写法: (Jack){3,}
忽略分组:每一组能够分组,但是没有编号 ?:
(Jack){3,}(?:love){2,}(work){3,}或 |
Ja(ck|Love)Kitty
package com.sxt.regexdemo;
public class RegexDemo02 {
public static void main(String[] args) {
String s = "http://abc aaaABCDEFG 123 [ xyz ().java";
String regex = "\\b";
System.out.println(s.replaceFirst(regex, "X"));
System.out.println(s.replaceAll(regex, "X"));
System.out.println(s.replaceAll(regex, "X"));
System.out.println(s.replaceAll(regex, "X"));
System.out.println(s.replaceAll(regex, "X"));
System.out.println(s.replaceAll(regex, "X"));
String s2 = "aaaxyz133";
String regex = "a{4,}xyz1?334?";
System.out.println(s2.matches(regex));
String s3 = "jackjacklovegirlfriend";
String regex = "(jack){2}love(?:girl)(friend)";
System.out.println(s3.matches(regex));
String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
String s = "2018-04-27";
System.out.println("原日期字符串:" + s);
String replace = s.replaceAll(regex, "$2/$3/$1");
System.out.println("使用正则修改后的日期字符串:" + replace);
String regex = "Ja(ck|Love)Kitty";
String s = "JaLoveKitty";
System.out.println(s.matches(regex));
}
}
- 正则表达式在Java当中的应用
- 主要就是使用正则表达式来处理字符串复杂的查找 find/替换replace/匹配matches/分割split工作
- boolean matches(String regex) 匹配matches
- String replaceFirst(String regex, String replacement) 替换replace
- String replaceAll(String regex, String replacement) 替换replace
- String[] split(String regex) 分割split工作
- String[] split(String regex, int limit) 分割split工作
- Pattern 正则表达式类
- Matcher 匹配器类 查找 find
package com.sxt.regexdemo;
import java.util.Arrays;
public class RegexDemo03 {
public static void main(String[] args) {
String src = "abc123xxdakjdka";
String regex = "[a-c]{3}\\d{3}x{2}";
System.out.println(src.matches(regex));
System.out.println(src.replaceAll(regex, "X"));
String src2 = "abc123efghid43opq";
String regex2 = "\\d+";
String[] strs = src2.split(regex2);
// System.out.println(Arrays.toString(strs));
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
System.out.println("--------------");
String[] strs2 = src2.split(regex2, 1);
System.out.println(Arrays.toString(strs2));
final String str1 = "HelloWorld";
final String str2 = "Hello" + "World";
System.out.println(str1 == str2);// true
final String str3 = "Hello" + String.valueOf("World");
/*
* Object obj = "World";
* public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public String toString() {
return this;
}
*/
System.out.println(str1 == str3);// false
}
}
- Pattern 正则表达式类
- Matcher 匹配器类
- 查找 find
- 1.先将正则表达式字符串编译成正则表达式对象
- 2.通过正则表达式对象创建匹配器对象
- 3.通过匹配器对象去做相应的字符串处理操作
package com.sxt.regexdemo;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo04 {
public static void main(String[] args) {
String src = "acd12345";
String regex = "[a-z]{3}\\d+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(src);
System.out.println(m.matches());
System.out.println(m.replaceAll("haha"));
System.out.println(Arrays.toString(p.split(src)));
}
}
On Friendship And a youth said, "Speak to us of Friendship." Your friend is your needs answered. He is your field which
- 获取两个字符组成的单词并且输出
package com.sxt.regexdemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo05 {
public static void main(String[] args) {
String s = "On Friendship And a youth said, \"Speak to us of Friendship.\" Your friend is your needs answered. He is your field which";
// 定义规则
String regex = "(\\b[a-zA-Z]{2}\\b)";
// 根据正则编译生成模型对象
Pattern p = Pattern.compile(regex);
// 根据模型对象来创建匹配器
Matcher m = p.matcher(s);
System.out.println(m.find());
System.out.println(m.start() + "|" + m.end());
System.out.println(s.substring(m.start(),m.end()));
System.out.println(m.group());
System.out.println(m.find());
System.out.println(m.group());
while (m.find()) {
System.out.println(m.group());
}
}
}
练习题:
比较手机号码
package com.sxt.practice01;
import java.util.Scanner;
/*
* 验证手机号
*
* 匹配如下四个手机号
* 18079243050
* 15160869850
* 18765068050
* 14235452850
*
* 找规则:
* 1.以1开头
* 2.一共11位
* 3.50结尾
* 4.倒数第三位是 0 或者 8
*/
public class Practice01 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入手机号码:");
String number = input.next();
String regex = "^1\\d{7}[08](50)$";
System.out.println(number.matches(regex));
}
}
把小写字母变成大写
package com.sxt.practice01;
/*
* He is a man
This is a boy
is that your car?
isn’t it?
What is your name?
将is替换替换成大写的IS
*/
public class Practice02 {
public static void main(String[] args) {
String src = "He is a man\r\n" +
" This is a boy\r\n" +
" is that your car?\r\n" +
" isn’t it?\r\n" +
" What is your name?";
String regex = "\\bis\\b";
String result = src.replaceAll(regex, "IS");
System.out.println(result);
}
}
日期替换
ackage com.sxt.practice01;
/*
* 日期替换
2016/03/05
demo/07/ss
1993/08/05
2016/11/24
12345/23/45678
12345/24/3356
1993-08-05
将正确的日期格式替换为03-05-2016
*/
public class Practice03 {
public static void main(String[] args) {
String src = "2016/03/05\r\n" +
" demo/07/ss\r\n" +
" 1993/08/05\r\n" +
" 2016/11/24\r\n" +
" 12345/23/45678\r\n" +
" 12345/24/3356\r\n" +
" 1993-08-05";
String regex = "\\b(\\d{4})[/-](\\d{2})[/-](\\d{2})\\b";
String result = src.replaceAll(regex, "$2-$3-$1");
System.out.println(result);
}
}