正则表达式入门知识

什么叫正则表达式?

正则表达式是一种编码格式,通过特定的格式来判断编码内容是否符合规范。

 

常用字符及作用

.:任意单个字符

[abc]:a或b或c

[^abc]:除a、b、c之外的任意字符

^:开始

$:结束

[a-z]:a到z

a|b:a或b

\s,\b,\d,\w:空格,单词边界,数字,数字字母下划线

\S,\B,\D,\S:上面取反

?、+、*:0到1次、1到n次、0到n次

{n}、{n,}、{n,m}:n次、n次以上、n到m次

 

在线生成工具:http://tools.jb51.net/regex/create_reg

 

 

正则表达式有三种匹配方式:

1.全匹配

2.部分匹配(开头匹配)

3.字符串匹配

 

使用方式:

  1. 创建Pattern对象(静态方法创建)
  2. 与字符匹配
  3. 使用的匹配模式(三种)
//matches使用方法:判断整体字符串和正则表达式是否匹配

		Pattern p=Pattern.compile(".*\\s");

		Matcher m=p.matcher("String");

		Boolean s=m.matches();
//lookingAt使用方式:判断字符串的开头是否匹配正则表达式

		Pattern p=Pattern.compile("正则表达式");

		Matcher m=p.matcher("待判断的字符串");

		Boolean s=m.lookingAt();

 

//Find使用方法:判断字符串中是否有符合正则表达式的子串
		Pattern p=Pattern.compile("正则表达式");
		Matcher m=p.matcher("待判断的字符串");
		while(m.find())
		{
			System.out.print(m.start());//返回子串起始索引
			System.out.print(m.end());//返回子串结束索引
			System.out.print(m.group());//返回捕获组
		}

 

$1和$2

在正则表达式中,$1和组(group)的功能类似,都是用于特定的截取规则,可以截取到已经获取到的字符的部分内容。

package com.pattern;

public class Demo_$1_$2 {

	public static void main(String[] args) {
		String tel="15629193043";
		//将电话号码中间四位隐藏****代替
		
		String after=tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$3");
		
		System.out.println(after);
	}
}

 

 

\0\1\2用法:

package com.pattern;

public class Demo_$1_$2 {

	public static void main(String[] args) {
		String msg="我我我我喜喜喜喜喜欢欢欢欢欢你你你你你";
		String msg2=msg.replaceAll("(.)\\1+", "$1");
		System.out.println(msg2);
	}
}

 

正则表达式应用:

1.填写表格的时候输入内容的格式的限制

2.爬虫

3.聊天内容的时候敏感词汇的屏蔽

4.聊天记录的提取

 

正则表达式小案例

这个案例可以用来计算文件(使用了上节课用的文件类内容以及目录遍历)中的代码、空行、注释的行数(流程配了相应的注释)

package com.work;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileReader;

//计算文件中有多少行注释
//多少行代码
//多少行空格




public class W3 {
	
	private static long space,code,commons;
	/*思路:
	 *   1.遍历文件(需要获得path,因此需要一个文件参数)
	 *   2.文件过滤
	 *   3.读文件中的内容
	 *   4.正则表达式,统计
	 */
	public static void fun(File dir) {
		//找到java文件,需要使用FileFilter文件过滤器
		//将目录内容列举出来
		File[] fs=dir.listFiles(new FileFilter() {
			
			//过滤器
			@Override
			public boolean accept(File pathname) {
				//允许通过的条件是:是目录或者文件名以.java结尾
				if(pathname.isDirectory()||pathname.getName().endsWith(".java"))
				{
					return true;
				}
				return false;
			}
		});
		//fs中保存的是经过过滤后的文件
		//遍历文件,如果是文件就读其中的内容如果是目录就递归
		for(File f:fs)
		{
			if(f.isFile())
			{
				readFile(f);
			}else
			{
				fun(f);
			}
		}
		
	}
	
	//读文件内容
	public static void readFile(File file) {
		boolean isCommon = false;//标记多行注释开始
		if(file != null && file.exists())
		{
			//文件输入流
			try {
				FileReader reader = new FileReader(file);          //使用文件字节流
				BufferedReader br = new BufferedReader(reader);    //将文件字节流转化成字符流(字节流一般用来读取音频和图片这类使用二进制方式保存的文件)
				String line = null;                                //保存读取的内容
				while((line=br.readLine())!=null)                  //如果内容不为空
				{
					line = line.trim();                            //去掉前后不必要的空格
					if(line.matches("^[\\s]*$"))                   //以空格开头和结尾,空格出现0到n次
					{
						space++;
					}else if(line.matches("^//.*"))                //以\\开头,后面接任意个字符(匹配//单行注释)
					{
						commons++;
					}else if(line.matches("^/\\*.*\\*/$"))         //以\*开头,后面任意个字符,然后以*/结尾(匹配单行注释)
					{
						commons++;
					}
					else if(line.matches("^/\\*.*")&& !line.matches(".*\\*/$"))     //以/*开头,后面接任意个字符并且任意字符之后不是以*/结尾
					{
						isCommon=true;
						commons++;
					}else if(isCommon)
					{
						if(line.matches(".*\\*/$"))                //当任意字符后接*/结尾,就说明多行注释结束(匹配度多行注释)
						{
							isCommon = false;
							commons++;
						}
						else
						{
							commons++;
						}
					}
					else {
						code++;
					}
					
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	
	
	//1.创建一个目录(自己要统计的目录)
	public static void main(String[] args) {
		File file =new File("E://pro");
		fun(file);
		System.out.println("有效代码行:"+code);
		System.out.println("注释:"+commons);
		System.out.println("空行:"+space);
		
	}

}

 

 

爬虫(用于爬取网页图片,正则表达式用于截取网址,涉及到后面才学的IO流,暂且就这样)

package com.work;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class W2 {

	public static void main(String[] args) throws Exception {
		// ① 设置爬哪个网站
		String path = "http://www.goupuzi.com/";
		URL url = new URL(path);

		// ②建立连接
		URLConnection conn = url.openConnection();

		// ③ 获取输入流读网站上的数据
		InputStream is = conn.getInputStream();

		InputStreamReader isr = new InputStreamReader(is, "utf-8");// 字节流转换成字符流的桥梁
		// 每次读1行
		BufferedReader br = new BufferedReader(isr);

		StringBuffer buffer = new StringBuffer();
		String line = null;
		while ((line = br.readLine()) != null) {
			buffer.append(line + "\n");
		}

		// ④ 使用正则表达式找到我们想要找的内容
		// <img.*/> 找到所有图片标签
		Pattern p = Pattern.compile("http://.*.jpg");
		Matcher m = p.matcher(buffer.toString());
		while (m.find()) {
			System.out.println(m.group());
			downImg(m.group());
		}
	}

	public static void downImg(String path) throws Exception {
		URL url = new URL(path);
		URLConnection conn = url.openConnection();
		InputStream is = conn.getInputStream();
		FileOutputStream fos = new FileOutputStream("src/imgs/" + UUID.randomUUID() + ".png");
		byte[] arr = new byte[1024];
		int len = -1;
		while ((len = is.read(arr)) != -1) {
			fos.write(arr, 0, len);
			fos.flush();
		}
		fos.close();
		is.close();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值