1. 正则表达式创建祖成规则
2. String类中的3个和正则表达式相关的方法
boolean matches(String regex) :
判断当前字符串是否和参数正则表达式匹配String[] split(String regex) :
使用指定的正则表达式切割当前字符串String replaceAll(String regex, String newStr) :
将调用者字符串中的所有匹配regex正则的子串,全部替换成newStr新串
- public boolean matches(String regex) 方法的使用
package cn.king.demo01;
import java.util.Scanner;
/*
* public boolean matches(String regex):
* 判断当前字符串是否和参数正则表达式匹配。
*/
/**
* 使用正则表达式校验qq号码:
* 1、要求必须是5-15位数字
* 2、0不能开头
*
* 分析:
* a:键盘录入一个qq
* b:写一个功能校验qq
* c:调用功能输出结果
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println("输入QQ: ");
String qq = new Scanner(System.in).nextLine();
System.out.println(checkQQ(qq));
}
public static boolean checkQQ(String qq) {
return qq.matches("[1-9][0-9]{4,14}");
}
}
/*
* 同理, 校验手机号只需要更换正则表达式即可,
* String regexForPhone="1[38]\\d{9}";
* 同理, 校验邮箱只需要更换正则表达式即可,
* String regexForMail = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
*/
- public String[] split(String regex) 方法的使用
package cn.king.demo01;
/**
* public String[] split(String regex):
* 使用指定的正则表达式切割当前字符串。
*/
public class Demo02 {
public static void main(String[] args) {
String s1 = "aa,bb,cc";
// 将字符串按照逗号分隔, 分隔出的每一部分都放到字符串数组中
String[] str1Array = s1.split(",");
for (int x = 0; x < str1Array.length; x++) {
System.out.println(str1Array[x]);
}
System.out.println("---------------------");
// 将字符串按照点分隔, 分隔出的每一部分都放到字符串数组中
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for (String item : str2Array) {
System.out.println(item);
}
System.out.println("---------------------");
String s3 = "aa bb cc";
// 将字符串按照点分隔, 分隔出的每一部分都放到字符串数组中
String[] str3Array = s3.split(" +");
for (String value : str3Array) {
System.out.println(value);
}
System.out.println("---------------------");
// 硬盘上的路径,我们应该用\\替代\
String s4 = "E:\\JavaSE\\day14\\avi";
// 将字符串按照\\分隔, 分隔出的每一部分都放到字符串数组中
String[] str4Array = s4.split("\\\\");
for (String s : str4Array) {
System.out.println(s);
}
System.out.println("---------------------");
}
}
package cn.king.demo01;
import java.util.Arrays;
/*
* 我有如下一个字符串:"91 27 46 38 50"
* 请写代码实现最终输出结果是:"27 38 46 50 91"
*
* 分析:
* A:定义一个字符串
* B:把字符串进行分割,得到一个字符串数组
* C:把字符串数组变换成int数组
* D:对int数组排序
* E:把排序后的int数组在组装成一个字符串
* F:输出字符串
*/
public class Demo03 {
public static void main(String[] args) {
// 定义一个字符串
String s = "91 27 46 38 50";
// 把字符串进行分割,得到一个字符串数组
String[] strArray = s.split(" ");
// 把字符串数组变换成int数组
int[] arr = new int[strArray.length];
for (int x = 0; x < arr.length; x++) {
arr[x] = Integer.parseInt(strArray[x]);
}
// 对int数组排序
Arrays.sort(arr);
// 把排序后的int数组在组装成一个字符串
StringBuilder sb = new StringBuilder();
for (int x = 0; x < arr.length; x++) {
sb.append(arr[x]).append(" ");
}
//转化为字符串
String result = sb.toString().trim();
//输出字符串
System.out.println("result:" + result);
}
}
- String replaceAll(String regex, String newStr) 方法的使用
package cn.king.demo01;
/**
* String replaceAll(String regex, String newStr) :
* 将调用者字符串中的所有匹配regex正则的子串,全部替换成newStr新串
*/
public class Demo04 {
public static void main(String[] args) {
String s = "helloqq12345worldkh622112345678java";
// 使用"*"替换所有的数字.
// 输出: helloqq*worldkh*java
System.out.println(s.replaceAll("\\d+", "*"));
// 输出: helloqq*****worldkh************java
System.out.println(s.replaceAll("\\d","*"));
// 直接把数字删除. 使用空字符串替换数字即可.
String result = s.replaceAll("\\d+", "");
System.out.println(result);
}
}
3. 正则中Pattern类和Matcher类的简单使用
- Pattern类的概述
正则表达式的编译表示形式。就是将正则表达式封装成的对象。该类仅仅代表将正则表达式封装成的对象。
正则表达式实际上是一个特殊的字符串,通过此类最后要将那个字符串封装正则表达式对象。
该类是final修饰不能有子类父类是Object. - Pattern类的功能
public static Pattern compile(String regex):
将给定的正则表达式字符串封装成正则表达式对象。
public Matcher matcher(CharSequence input):
创建匹配给定参数与此正则表达式的匹配器。 String类实现了CharSequence 接口.
package cn.king.demo01;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo05 {
public static void main(String[] args) {
// 1. 获取正则表达式对象
String regex = "a*b";
Pattern pattern = Pattern.compile(regex);
// 2. 通过正则表达式对象获取匹配器对象, 参数是我们要操作的数据
Matcher matcher = pattern.matcher("aaaaab");
// 3. 调用匹配器对象的匹配功能,对字符串进行操作
boolean b = matcher.matches();
System.out.println(b);
// 上面是Pattern(模式,即正则表达式对象)和Matcher(匹配器)的基本使用顺序.
/*
* 上面的功能是使用正则表达式的判断功能,
* 即判断某字符串是否匹配给定的正则表达式.
* 如果是做判断,上面的代码就麻烦了,
* 我们直接使用String的public boolean matches(String regex)方法即可.
* 如下两行:
*/
boolean b1 = "aaaaab".matches("a*b");
System.out.println(b1);
}
}
/*
* 正则表达式的使用步骤:
* 1. 将正则表达式字符串封装成正则表达式对象即 Pattern 对象.
* 2. 用 Pattern 对象获得匹配器 Matcher 对象
* 3. 用匹配器 Matcher 对象结合正则对象来操作(匹配)要被操作的字符串
* 4. 操作(匹配)完的结果都在匹配器中
*/
/*
* Matcher类的功能:
* public boolean matches(): 判断字符串和正则是否匹配。
* public boolean find(): 查找存不存在符合正则的子串。
* public String group(): 获取查找的符合正则的子串。
*/
package cn.king.demo01;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 获取功能:
* 获取下面这个字符串中由三个字符组成的单词
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
*/
public class Demo06 {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 规则
String regex = "\\b\\w{3}\\b";
// 把规则编译成模式对象
Pattern p = Pattern.compile(regex);
// 通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
// 调用匹配器对象的功能
// 通过find方法就是查找有没有满足条件的子串
while (m.find()) { // 判断是否有匹配正则的字串
// 取出匹配正则的字串
System.out.println(m.group());
}
// 注意:一定要先find(),然后才能group()
}
}
package cn.king.demo01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// 超级简易爬虫
// 功能: 获取某网页上所有的URL装到List集合中
public class Demo {
public static void main(String[] args) throws IOException {
List<String> UrlList = getByWeb();
for (String url : UrlList) {
System.out.println(url);
}
}
public static List<String> getByWeb() throws IOException {
//1、得到网页输入流
URL url = new URL("http://win7.wanming01.cn");
BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(url.openStream()));
//2、对读取的数据进行规则的匹配。从中获取符合规则的数据
// String regex="\\w+@\\w+(\\.\\w+)+";
String regex = "(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
Pattern pattern = Pattern.compile(regex);
List<String> list = new ArrayList<>();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
Matcher matcher = pattern.matcher(line);
while (matcher.find()) { // 判断是否有符合正则的字符串
// 将符合规则的子串取出后储存到集合中
list.add(matcher.group());
}
}
return list;
}
}