---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。但是符号定义越多,正则表达式就会越长,阅读性就会越差。
正则表达式的构造摘要:
(1)字符类
[abc] a、b
[^abc] 任何字符,除了
[a-zA-Z]
[a-d[m-p]]
[a-z&&[def]]
[a-z&&[^bc]]
[a-z&&[^m-p]]
(2)预定义字符类
.
d
D
s
S
w
W
注意:因为这些都是转义字符,在操作字符串是前面要多加一个""。如将字符串str按"."切割。
String str = "apple.banana.orange.mango";
String reg = "\.";
String[] arr = str.split(reg);
(3)边界匹配器
^
$
B
A
G 上一个匹配的结尾
z
(4)Greedy
X?
X*
X+
X{n}
X{n,}
X{n,m}
(5)组
当我们想要让一个规则的结果被重用时,可以将这个规则封装成一个组,用()来完成。每个组都有自己的编号,从1开始。想要使用已有的组,可以通过 (n表示组的编号)的形式获取。如对一个字符串按叠词进行分割。
String str = "bghhdcajjf";
String reg = "(.)\1";
String[] arr=str.split(reg);
正则表达式的具体操作功能:
(1)匹配
用String类中的matches方法。
boolean matches(String regex);告知此字符串是否匹配给定的正则表达式,如果匹配返回true,如果有一次不匹配,则返回false。如匹配一个qq号(5-15)位,开头不能为0
String qq = "1234567";
System.out.println(qq.matches("[1-9][0-9]{4,14}"));//结果为true。
String qq1 = "1234a67";
System.out.println(qq.matches("[1-9][0-9]{4,14}"));//结果为false。
(2)切割
用String类中的split方法。
String[] split(String regex);根据给定正则表达式的匹配拆分此字符串。如将字符串按照"\"切割
String str = "d:\123\abc";
String reg = "\\"; //在字符串中一个要用转义"\"表示
String[] arr=str.split(reg);
(3)替换
用String类中的replaceAll方法。
String replaceAll(String regex,String replacement); 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。如将字符串中的重叠字符换成单个字符
String
str = "abccdefffklhhhh";
String
reg = "(.)\1+"; //"+"表示不止两个字符重叠
str = str.replaceAll(reg,"$1");
注:$n用来获取前面规则中的组,n表示组号。
(4)获取
就是将字符串中符合规则的子串取出。
操作步骤:
a.将正则表达式封装成对象
b.让正则对象和要操作的字符串相关联
c.关联后,获取正则匹配引擎
d.通过引擎对符合规则的子串进行操作。
如将字符串中由3个字符组成的子串取出。
import java.util.regex.*;
class RegexDemo
{
public static void main(String[] args)
{
String str = "da jia hao,huan ying lai dao hei ma!";
String reg = "\b[a-z]{3}\b";
//将规则封装成对象
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
while(m.find()) //将规则作用到字符串上,并进行符合规则的子串查找。
{
System.out.println(m.group());//作用于匹配后结果。
}
}
}
在操作字符串时,这四种功能应该如何选择呢?如下
(1)如果只想知道该字符串是对是错,就要使用匹配。
(2)如果想要将已有字符串变成另一个字符串,就要使用替换。
(3)如果想要按照自定义方式将字符串变成多个字符串,就要使用切割。(获取符合规则以外的子串)
(4)如果想要拿到符合要求的字符子串,就要使用获取。(获取符合规则的子串)
应用实例:
(1)获取某一指定文件中的邮箱地址
import java.net.*;
import java.io.*;
import java.util.regex.*;
class RegexText
{
public static void main(String[] args) throws Exception
{
getMails();
getMails_1();
}
//网页爬虫
public static void getMails_1()throws Exception
{
URL url = new URL("http://169.254.246.232:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailreg = "\w+@\w+(\.\w+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
/*
指定文件中的邮箱地址
使用获取功能。pattern Matcher
*/
public static void getMails()throws Exception
{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String line = null;
String mailreg = "\w+@\w+(\.\w+)+";
Pattern p = Pattern.complie(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}
--------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------