详解正则表达式

前端之家收集整理的这篇文章主要介绍了详解正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

什么是正则表达式:

正则表达式,又称规则表达式(英语: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}

原文链接:https://www.f2er.com/regex/358482.html

猜你在找的正则表达式相关文章