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

详解正则表达式

发布时间:2020-12-14 00:40:26 所属栏目:百科 来源:网络整理
导读:什么是正则表达式: 正则表达式 ,又称规则表达式 。 (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。 正则表通主要被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字

什么是正则表达式:

正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通主要被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎,还有java语言自带的。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。


正则表达式的书写规则:

1.方括号[]:

方括号使用只能匹配单个字符,如果想匹配一个字符串就要用到圆括号()

[abcde] 表示检索的句子中是否出现a、b、c、d、e字母的出现

例:String=“abckeoaiwk”,则输出的结果为:


[a-z]表示检索的句子中是否出现a-z范围的字母


2.圆括号():

圆括号使用可以匹配多个字符,每组的字符要用|隔开

(ab|cd|ai|de)表示检索的句子是否出现ab、cd、ai、de字符串的出现

例:String=“abckeoaiwk”,则输出的结果为:


3.大括号{}:

大括号{}里面填的是数字,表示检索字符或者字符串连续出现的次数

[a-z]{1,2}表示检索的句子中是否连续出现a-z范围的字母 1-2次

以下有几个特殊符号也表示检索的次数(重点):

? 表示检索出现1次或者没有(0-1)

* 表示检索出现多次或者没有(0-多次)

+ 表示检索出现1次以上(1-多次)


例:String=“ababcke2oaiwk”,正则表达式=“[a-d]+”,输出的结果为:


4.非符号^:

a.非符号^有两种用法,在方括号[]内表示否定字符

[^a-z]+ 表示检索字符串中的非字母的字符

例:String =“abcabcke2oai9wk”,输出的结果为:

String=“abcabcke2oai959w66k”,输出的结果为:

b.不在方括号时,表示检索字符串的开头

^abc 表示检索以abc开头的字符串

主要用来判断字符串是否以***为开头


String=“abcabcke2oai959w66k”,输出的结果为:



5.结尾符号$:

k$表示检索字符串是否以k结尾

主要用来判断字符串是否以***为结尾


String=“abcabcke2oai959w66k”,输出的结果为:


接下来是一些常用的特殊字符:

s 表示匹配任何空白字符,如空格、换行符、制表符

S 表示匹配任何非空白字符,与s相反

d 表示匹配0-9的字符(注意每次匹配的都是单个字符)

D 表示匹配非0-9的字符(用String=“D”表示正则表达式, 要用 来进行转义)

w 表示匹配a-z的字符

W 表示匹配非a-z的字符


使用正则表达式:

使用正则表达式,要通过调用Pattern类和Matcher类实现对字符串的匹配。

Pattern类:用来编译正则表达式,然后创建一个模式匹配器matcher对象


Matcher类:执行匹配操作,并可通过其中的方法输出匹配的内容


接下来,我们编写一个类来获取一个网页源代码中的链接属性(即a标签的href属性):



import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test{
	/**
	 * 功能:通过一个url获取网页的源代码
	 * @param url 指定网页的ip地址
	 * @return 返回一个网页源代码的字符串
	 */
	public static String getUrlResource(URL url){
		String msg="";
		try {
			HttpURLConnection conn=(HttpURLConnection) url.openConnection();
			//建立一个http协议的连接
			conn.setRequestMethod("GET");
			//设置连接的方法GET
			conn.setConnectTimeout(5*1000);
			//设置连接时长
			InputStream is=conn.getInputStream();
			//获取连接的输入流
			Scanner sc=new Scanner(is,"UTF-8");
			//通过Scanner把输出流转为字符串String保存
			while(sc.hasNextLine()){
				msg+=sc.nextLine();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return msg;
	}
	public static void main(String args[]){
		String msg="";
		try {
			URL url=new URL("http://www.baidu.com");
//			
			msg=getUrlResource(url);
			//获取百度主页的源代码
//			System.out.println(msg);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		String regEx="href="([^"]+)"";
		//正则表达式为:href="([^"]*)"
		Pattern p=Pattern.compile(regEx);
		//编译正则表达式
		Matcher m=p.matcher(msg);
		while(m.find()){
			System.out.println(m.group(0));
			System.out.println(m.group(1));
		}
	}
}





重点分析

分析正则表达式的书写:href="([^"]+)"

获取a标签的href属性,即引号的内容就是我们的目标内容,但是要排除一种情况,引号内还有引号的情况,所以

把这种情况除掉就可以了。

有人会分析到,href="([^"]+)"与href="[^"]+"有啥区别:

那就是前者有把匹配的内容进行分组,如果href="http://www.baidu.com"是目标内容,那么m.group(0)就是

href="http://www.baidu.com",m.group(1)就是http://www.baidu.com(m.group(0)等价于m.group())

那后者则是没有分组的,也就是只能输出href="http://www.baidu.com",但这并不全是我们想要的,而且这时候

m.group(1)是不存在的。

所以()可以进行对匹配的信息进行分组的作用。

下面还有一些常用的正则表达式:

验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”

验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”

验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”

身份证号(15位、18位数字):^d{15}|d{18}$

短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

日期格式:^d{4}-d{1,2}-d{1,2}

(编辑:李大同)

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

    推荐文章
      热点阅读