Java正则表达式的概念及使用

正则表达式(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());
	}
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44830627/article/details/105155401