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