加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:32:38 所属栏目:百科 来源:网络整理
导读:一、概述 正则表达式:符合一定规则的表达式。 作用:用于专门操作字符串。 特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写。 所以,学习正则表达式,就是在学习一些特殊符号的使用。 好处:可以简化对字符串的复杂操作。 弊端:符合定义越


一、概述

正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。

特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写。

所以,学习正则表达式,就是在学习一些特殊符号的使用。

好处:可以简化对字符串的复杂操作。

弊端:符合定义越多,正则越长,阅读性越差

二、正则表达式的构造摘要

1、字符

x 字符 x
反斜线字符
n 带有八进制值 0 的字符 n (0<=n<=7)
nn 带有八进制值 0 的字符 nn (0<=n<=7)
mnn 带有八进制值 0 的字符 mnn(0<=m<=3、0<=n<=7)
xhh 带有十六进制值0x 的字符 hh
uhhhh 带有十六进制值0x 的字符 hhhh
t 制表符 ('u0009')
n 新行(换行)符 ('u000A')
r 回车符 ('u000D')
f 换页符 ('u000C')
a 报警 (bell) 符 ('u0007')
e 转义符 ('u001B')
cx 对应于 x 的控制符

2、字符类

[abc] abc(简单类)
[^abc] 任何字符,除了 abc(否定)
[a-zA-Z] azAZ,两头的字母包括在内(范围)
[a-d[m-p]] admp[a-dm-p](并集)
[a-z&&[def]] def(交集)
[a-z&&[^bc]] az,除了 bc[ad-z](减去)
[a-z&&[^m-p]] az,而非 mp[a-lq-z](减去)

3、预定义字符类

. 任何字符(与行结束符可能匹配也可能不匹配)
d 数字:[0-9]
D 非数字: [^0-9]
s 空白字符:[ tnx0Bfr]
S 非空白字符:[^s]
w 单词字符:[a-zA-Z_0-9]
W 非单词字符:[^w]

4、边界适配器

^ 行的开头
$ 行的结尾
b 单词边界
B 非单词边界
A 输入的开头
G 上一个匹配的结尾
Z 输入的结尾,仅用于最后的结束符(如果有的话)
z 输入的结尾

5、Greedy数量词

X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

6、Reluctant 数量词

X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n
X{n,}? X,至少 n
X{n,m}? X,至少 n 次,但是不超过 m

7、组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1

((A)(B(C)))

2

A

3

(B(C))

4

(C)

看它有几组,就看它有几个左括号。((A)(B(C)))有四个左括号,有四组。

三、具体操作功能

1、匹配

String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

例1 判断输入格式

/*
对QQ号码进行校验
要求:5~15	0不能开头,只能是数字

这种方式,使用了String类中的方法,进行组合完成了需求,但是代码国语复杂。
*/
class RegexDemo
{
	public static void amin(String[] args)
	{
		checkQQ();
	}
	public static void checkQQ()
	{
		String qq="23456";

		String regex="[1-9] [0-9] {4,14}";//输入1~9的数;输入的只能是数字;字符串长度5~15

		boolean flag=qq.matches(regex);//判断
		if(flag)
			System.out.println(qq+"...is ok");
		else
			System.out.println(qq+"...不合法");
	}
}

2、切割

String split():

例2

class RegexDemo
{
	public static void main(String[] args)
	{
		//splitDemo("zhangsan.lisi.wangwu",".");
		//splitDemo("c:abca.txt","\");

		splitDemo("erkktyqqquizzzzo","(.)1+");//按照叠词完成切割。为了可以让规则的结果被重用
												//可以将规则封装成一个组、用()完成。租的出现都有编号。
												//从1开始。想要使用已有的组可以通过  n(n就是组的编号)的形式来获取。
	}

	public static void splitDemo(String str,String reg)
	{
		//String reg=" +";//按照多个空格来进行切割
		String[] arr=str.split(reg);//以正则表达式的规则来切割
		System.out.println(arr.length);
		for(String s:arr)
		{
			System.out.println(s);
		}
	}
}

结果输出:

以“”切,需传入正则规则为:“\”。是因为在正则表达式中,代表,它们的前一个代表字符串中的转义。
3、替换

String replaceAll()

例3

class RegexDemo
{
	public static void main(String[] args)
	{
		String str="wqe525235325gf5367676dfg142142424";//将字符串中的数组替换成#

		replaceAllDemo(str,"d{5,}","#");//把超过连续5个或以上的数字替换为#号

		String str1="efjjhhhhhwqqqiiiiiiiiio";//将叠词替换成单个字母。hhhh——>h
		replaceAllDemo(str1,"(.)1+","$1");//任意一个字符,它的下一个字符或多个重复,则将叠词换为单个字符
	}

	public static void replaceAllDemo(String str,String reg,String newStr)
	{
		str=str.replaceAll(reg,newStr);

		System.out.println(str);
	}
}

结果输出:


4、获取

正则表达式的第四个功能。
获取:将字符串中的的符合规则的子串取出。

Pattern

操作步骤:
1、将正则表达式封装成对象。
2、让正则对象和要操作的字符串相关联。
3、关联后,获取正则匹配引擎。
4、通过引擎对符合规则的子串进行操作,比如取出。

例4

import java.util.regex.*;
class RegexDemo
{
	public static void main(String[] args)
	{
		getDemo();
	}
	public static void getDemo()
	{
		String str="ming tian jiu yao fang jia le";
		System.out.println(str);
		String reg="b[a-z]{4}b";//设定规则

		//将规则封装成对象。
		Pattern p=Pattern.compile(reg);

		//让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m=p.matcher(str);

		//System.out.println(m.matches());其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
											//只不过被String的方法封装后,用起来较为简单,但是功能却单一。

		//boolean b=m.find();将规则作用到字符串上,并进行符合规则的子串查找。
		//Systemoutprintln(b);
		//System.out.println(m.group());用于获取匹配后结果
		
		while(m.find())//尝试查找匹配的字符段
		{
			System.out.println(m.group());//返回匹配的子串
			System.out.println(m.start()+"...."+m.end());//打印匹配字段的角标
		}
	}
}

结果输出:

练习1

/*
需求:
将下列字符串转成:我要学编程。

到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1、如果只想知道该字符是否对是错,使用匹配。
2、想要将已有的字符串编程另一个字符串,替换。
3、想要按照自定的方式将字符串编程多个字符串。切割。获取规则以外的子串。
4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/
class RegexDemo
{
	public static void main(String[] args)
	{
		test();
	}
	public static void test()
	{
		String str="我我...我我..我要...要要..要要..学学学..学学..编编编..程.程";
		/*
		将已有字符串编程另一个字符串。使用替换功能。
		1、可以先将.去掉
		2、再将多个重复的内容变成单个内容。
		*/
		str=str.replaceAll(".+","");//把.替换为空字符串
		System.out.println(str);

		str=str.replaceAll("(.)1+","$1");//把重复的词只保留1个

		System.out.println(str);
	}
}
	

结果输出:



练习2

(1)

/*
192.68.1.254   12.49.23.13 1.1.10.10 2.2.2.2 8.12 131.22
将ip地址进行地址段顺序的排序。

还按照字符串自然顺序,只要让它们每一段都是3位即可。
1、按照每一段需要的最多的0进行补充,那么每一段就会至少保证有3位。
2、将每一段只保留3位。这样,所有的ip地址都是每一段3位
*/
import java.util.*;
class RegexDemo
{
	public static void main(String[] args)
	{
		ipSort();
	}
	public static void ipSort()
	{
		String ip="192.68.1.254   12.49.23.13 1.1.10.10 2.2.2.2 8.12 131.22";
		
		ip=ip.replaceAll("(d+)","00$1");//数字前加00,保证至少有三位
		System.out.println(ip);

		String[] arr=ip.split(" +");//以一个或多个空格分割字符串,以数组形式保存

		TreeSet<String> ts=new TreeSet<String>();

		for(String s:arr)//用增强for循环把数组元素添加到集合中
		{
			ts.add(s);
		}

		for(String s:ts)
		{
			System.out.println(s.replaceAll("0*(d+)","$1"));//至少一个个数字前跟着0;只保留不为零的数字
		}
	}
}

结果输出:


(2)

/*
需求:对邮件地址进行校验。
*/
class RegexDemo
{
	public static void main(String[] args)
	{
		checkMail();
	}
	public static void checkMail()
	{
		String mail="abc12@sina.com";

		mail="1@1.1";

		String reg="[]a-zA-Z0-9+@[a-zA-Z0-9]+(.[a-zA-Z]+)+";//较为精确的匹配
		reg="w+@w+(.w+)+";//相对不太精确的匹配

		//mail.indexOf("@")!=-1;含有@的字符串

		System.out.println(mail.matches(reg));//true
	}
}

5、网络爬虫(蜘蛛)

例5

/*
网页爬虫(蜘蛛)

获取指定文档中的邮件地址。
使用获取功能。Pattern	Matcher
*/
import java.io.*;
import java.util.regex.*;
class RegexText
{
	public static void main(String[] args)throws Exception
	{
		getMails();
	}
	public static void getMails()throws Exception
	{
		BufferedReader bufr=new BufferedReader(new FileReader("1.txt"));//创建读取缓冲流读取文件

		String line=null;

		String mailreg="w+@w+(.w+)+";//设置正则表达式
		Pattern p=Pattern.compile(mailreg);//将给定的正则表达式编译到模式中。

		while((line=bufr.readLine())!=null)
		{
			Matcher m=p.matcher(line);//该模式的匹配器
			while(m.find())//寻找匹配的字符
			{
				System.out.println(m.group());//返回匹配的子序列
			}
		}
	}
}

结果输出:

例6

/*
网页爬虫(蜘蛛)

获取指定网页中的邮件地址。
使用获取功能。Pattern	Matcher
*/
import java.io.*;
import java.util.regex.*;
class RegexText
{
	public static void main(String[] args)throws Exception
	{
		getMails_1();
	}
	public static void getMails_1()throws Exception
	{
		URL url=new URL(" 172.16.17.71:8080/myweb/mail.html");//创建资源指针,指向资源

		URLConnection conn=url.openConnection();//表示到 URL 所引用的远程对象的连接

		BufferedReader bufr=new BufferedReader(new FileReader(conn.getInputStream()));//创建读取缓冲流读取文件

		String line=null;

		String mailreg="w+@w+(.w+)+";//设置正则表达式
		Pattern p=Pattern.compile(mailreg);//将给定的正则表达式编译到模式中。

		while((line=bufr.readLine())!=null)
		{
			Matcher m=p.matcher(line);//该模式的匹配器
			while(m.find())//寻找匹配的字符
			{
				System.out.println(m.group());//返回匹配的子序列
			}
		}
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读