正则表达式(Regular Expression)
1、什么是正则表达式?
正则表达式使用单个字符串来描述,匹配一系列符合某个语句规则的字符串,定义了字符串的模式。
2、正则表达式用来干什么?
正则表达式主要用于字符串中,为方便字符串操作,文本的复杂处理,字符串的操作主要有四种,匹配、切割、替换、获取。
3、匹配是什么?
匹配一些字符串,根据题目要求(后面有具体例子说明)
4、正则表达式的普通字符
字母、数字、汉字、下划线以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
5、正则表达式的转义字符
6、标准字符集合
1)能够与多种字符匹配
2)注意区分大小写,大写是相反的意思
7、自定义字符
[ ]方括号匹配方式:能够匹配方括号中的任意一个字符
1)正则表达式的特殊符号,被包含到中括号中,则失去特殊意义,除了^,-之外。
2)标准字符集合,除小数点外,如果被包含在中括号中,自定义字符集合将包含该集合,比如:[\d.-+] 将匹配数字,小数点、+、-
例子:将字符串“123”替换为“ABC”
public class HelloWorld {
public static void main(String[] args) {
String line="123yhf";
String line1="s1jh2ed3yhf";
String replace=line.replaceAll("123","ABC");
String replace1=line1.replaceAll("123","ABC");
//这个需要123是连在一起的,如果是String line="s1jh23yhf";就只能输出s1jh23yhf
System.out.println(replace);
System.out.println(replace1);
}
}
输出结果:
ABCyhf
s1jh2ed3yhf
那么看这个例子,将字符串中的所有数字替换为A
public class HelloWorld {
public static void main(String[] args) {
String line1="s1jh2eDF12345GGGd3yhf";
String replace1=line1.replaceAll("[0-9]","A");
System.out.println(replace1);
}
}
输出结果:
sAjhAeDFAAAAAGGGdAyhf
用正则表达式做
import java.util.regex.*;
public class HelloWorld {
public static void main(String[] args) {
String line1="s1jh2eDF12345GGGd3yhf";
Pattern p= Pattern.compile("[0-9]");
Matcher m=p.matcher(line1);
System.out.println(m.replaceAll("A"));
}
}
输出结果:
sAjhAeDFAAAAAGGGdAyhf
8、量词
{n} 表达式重复n次
{m,n} 表达式至少重复m次,最多重复n次
{m,} 表达式至少重复m次
? 匹配表达式0次或者1次,相当于{0,1}
- 表达式至少出现1次,相当于{1,}
- 表达式不出现或出现任意次,相当于{0,}
匹配次数中的贪婪模式(匹配的字符越多越好,默认!)
匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个“?”号)
9、字符边界
^ 与字符串开始的地方匹配
$ 与字符串结束的地方匹配
\b 匹配一个单词边界
\b匹配这样一个位置:前面的字符和后面的字符不全是\w
IGNORECASE 忽略大小写模式
--匹配是忽略大小写
--默认情况下,正则表达式是要区分大小写的
SINGLELINE 单行模式
--整个文本看作是一个字符串,只有开头,一个结尾
--使小数点“.”可以匹配包含换行符(\n)在内的任意字符
MULTILINE 多行模式
--每行都是一个字符串,都有开头和结尾
--在指定了MULTILINE之后,如果需要仅匹配字符串开始和结束位置,可以使用\A和\Z
10、选择符与分组
11、预搜索(领宽断言)
例子1:匹配
在这个字符串:asfsdf23323,是否符合指定的正则表达式 \w+
【说明:\w是匹配大小写字母、数字或下划线中的任意一个
+表示表达式至少出现1次,相当于{1,}】
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Person {
public static void main(String[] args) {
//在这个字符串:asfsdf23323,是否符合指定的正则表达式 \w+
//表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m= p.matcher("asfsdf$23323");
boolean yesorno=m.matches();
System.out.println(yesorno);
}
}
输出结果:false
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Person {
public static void main(String[] args) {
//在这个字符串:asfsdf23323,是否符合指定的正则表达式 \w+
//表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m= p.matcher("asfsdfAS_23323");
boolean yesorno=m.matches();//尝试将整个字符序列与该模式匹配
System.out.println(yesorno);
}
}
输出结果:true
例子2:查找
这个字符串:qqq2#asfsd%%fAS_23323,查找是否符合指定的正则表达式 \w+,有就输出
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Person {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m= p.matcher("qqq2#asfsd%%fAS_23323");
while (m.find()) {
System.out.println(m.group());//也可以这么写System.out.println(m.group(0));
}
}
}
例子3:分组查询
分组查询22qqq2asfsdfAS_23323----"([0-9]+)([a-z]+)"
含有数字,含有小写字母的分组
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Person {
public static void main(String[] args) {
//在这个字符串:asfsdf23323,是否符合指定的正则表达式 \w+
//表达式对象
Pattern p = Pattern.compile("([0-9]+)([a-z]+)");
//创建Matcher对象
Matcher m= p.matcher("22qqq2asfsdfAS_23323");
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
}
例子四:替换
将数字替换成%
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Demo01 {
public static void main(String[] args) {
Pattern p=Pattern.compile("[0-9]");
Matcher m=p.matcher("ssss4545QWww_vv4");
System.out.println(m.replaceAll("%"));
}
}
例子5:字符串的切割
以数字进行切割
import java.util.Arrays;
public class Demo01 {
public static void main(String[] args) {
String str="dfga12222b55555crrrr";
String[]arr=str.split("\\d+");
System.out.println(Arrays.toString(arr));
}
}
例子6:网络爬虫取链接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 网络爬虫取链接
* @author xinbai
* 2020-4-8,下午8:19:40
*/
public class Demo01 {
public static String getURLContent(String urlStr){
StringBuilder sb=new StringBuilder();
try {
URL url=new URL(urlStr);
BufferedReader reader =new BufferedReader(new InputStreamReader(url.openStream()));
String temp="";
while((temp=reader.readLine())!=null){
sb.append(temp);
}
} catch (MalformedURLException e) {
// TODO: handle exception
e.printStackTrace();
}
catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
return sb.toString();
}
public static void main(String[] args) {
String deStr=getURLContent("http://www.baidu.com");
Pattern p=Pattern.compile("<a[\\s\\S]+?</a>");
Matcher m=p.matcher(deStr);
while (m.find()) {
System.out.println(m.group());
}
}
}