----------------------android培训、java培训、期待与您交流!----------------------
Java正则表达式
一 概述:
1.概念:
正则表达式(英语:Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。
2.作用:
用一个对应的表达式操作字符串,对字符串进行匹配,替换,分割等操作。
优点是可以简化对字符串的复杂的操作,但是符合定义越多,正则越长,阅读性越差。
二 常见的正则表达式符号
说明:X表示字符X或者匹配的规则。
1、字符
x 字符 x\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
2、字符类
[abc] a、b或 c(简单类)[^abc] 任何字符,除了 a、b或 c(否定)
[a-zA-Z] a到 z或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a到 d或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e或 f(交集)
[a-z&&[^bc]] a到 z,除了 b和 c:[ad-z](减去)
[a-z&&[^m-p]] a到 z,而非 m到 p:[a-lq-z](减去)
3、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\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、组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
在替换中常用$匹配组的内容。用数字匹配组中第几个位置的内容。
三 正则表达式的应用:
正则表达式主要有四个应用:匹配、替换、切割、获取
1.匹配:
使用String类中的boolean String.matches(String regex);方法。regex为规则,返回值为布尔值,若字符串中有符合正则表达式的字符串就返回true,否则返回false。
示例程序,判断一个号码是否是5连尾号的手机号:
public class PhoneNumber
{
public static void main(String[] args)
{
//自定义一个手机号
String s = new String("13866688888");
//调用检测函数
checkPhone5(s);
}
public static void checkPhone5(String s)
{
//正则表达式 后面是0到9有一位然后下一位与这位相同,还有4位,加起来就是5位
String regex_5 = "[1][3458][0-9]{4}([0-9])\\1{4}";
//正则匹配。。
boolean flag = s.matches(regex_5);
//判断结果
if(flag)
System.out.println("号码:"+s+"是尾号五连手机号");
else
System.out.println("号码:"+s+"不是尾号五连手机号");
}
}
2.替换:
方法:boolean String.replaceAll(regex);
3.切割:
方法:boolean String.split(regex);
四 综合应用 - - 网页爬虫
毕老师的视频有讲到,这里利用到了正则表达式的四种应用,很好的实例。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。
*
* 爬取邮箱地址。
*
*/
public class RegexTest2 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
List<String> list = getMailsByWeb();
for(String mail : list){
System.out.println(mail);
}
}
public static List<String> getMailsByWeb() throws IOException {
//1,读取源文件。
// BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufIn.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3,将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}
public static List<String> getMails() throws IOException{
//1,读取源文件。
BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufr.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3,将符合规则的数据存储到集合中。
list.add(m.group());
}
}
return list;
}
}