您的位置:首页 > 编程语言 > Java开发

JAVA基础——正则表达式

2015-06-13 18:35 501 查看
正则表达式


一、概述

1.概念:符合一定规则的表达式

2.作用:用一些特定的符号来代表一些代码,操作字符串

3.好处:可以简化书写,简化对字符串的操作

4.弊端:字符定义越多,正则越长,阅读性很差

二、常见符号

[]:字符中的一个,[a-zA-Z][0-9]
. :一个任意字符
\d:数字
\w:单词字符[0-9a-zA-Z]
X?:X出现0次或者一次
X+:X出现一次或者多次
X*:X出现0次或者多次
X{n}:出现n次
X{n,}:至少n次
X{n,m}:出现n,到m次
^:行的开头
$:行的结尾
\b:单词边界
\B:非单词边界


三、几个操作

1.匹配:matches()

String类中的booleanmatches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

2.切割:split():

切割lisi.zhangshan.wangwu:split(“\.”)

切割C:\abc\bc.txt时:split(“\\”)

组切割”dsfggggfwsfefff”时,split(“(.)\1+”)

注意:按照叠词进行切割:为了让规则的结果被重用,可以用()将规则封装成一个组,每个组都有编号。对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。


4.替换:replaceAll(regex,str)

“erygrgthgfffffffdgheggg”将叠词替换成单个字符:regex=”(.)\1+” str=”$1” //取第一组

5.获取:将字符串中符合规则的子串取出

步骤:
1.将正则表达式封装成对象
2.让正则对象和要操作的字符串相关联
3.关联后,获取正则匹配引擎
4.通过引擎对符合规则的字符串进行操作


示例:

public static void getString(String s,String regex)
{
//将规则封装成对象。
Pattern p=Pattern.compile(regex);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m=p.matcher(s);

//System.out.println(m.matches());
//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。

while(m.find())//find()方法是将规则作用到字符串上,并进行符合规则的子串查找。
{
System.out.println(m.group());//group()方法用于获取匹配后结果。
System.out.println(m.start()+"...."+m.end());
//start()和end()分别表示匹配字符的开始和结尾的索引
}
}


四、几个练习

1、对IP地址段进行排序

思路:
还按照字符串自然顺序,只要让他们每一段都是3位即可。
1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。

public static void IPSort1() {
String ip = "192.168.255.1 10.0.0.1 127.0.8.2 2.2.2.2";
//将ip的每一段补0,确保每一段至少都有3位数字
String ip1 = ip.replaceAll("(\\d+)", "00$1");
//保留ip的后面三位
ip = ip1.replaceAll("0*(\\d{3})", "$1");
//将字符串进行切割
String[] ipa = ip.split(" +");
//定义TreeSet集合,进行自然排序
TreeSet<String> ts = new TreeSet<String>();
for(String s:ipa) {
ts.add(s);
}

for(String s1:ts) {
//去掉ip段多余的0
System.out.println(s1.replaceAll("0*(\\d+)", "$1"));
//排序结果:2.2.2.2   10.0.0.1   127.0.8.2   192.168.255.1
}


2.对邮件进行校验

regex=”[a-zA-z0-9_]@[a-zA-Z]+(\\.[a-zA-Z0-9]+)+”   //较为精确的匹配
regex=”\\w+@\\w+(\\.\\w+)+”    //相对不太精确的匹配


3。写一个网络爬虫

网络爬虫(蜘蛛)
实际上是一个功能,用于搜集网络上的指定信息
需求:可用于收集邮箱,qq号等之类的信息。
应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog

//获取网页中mail
public static  void getWebMail()throws Exception
{
//封装网页地址
URL url=new URL("http://tieba.baidu.com/p/1390896758");
//连接服务器
URLConnection conn=url.openConnection();
//带缓冲区的网页读取流
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line=null;

//定义匹配邮件地址的正则表达式
String regex="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.compile(regex);//封装正则表达式
//读取网页数据
while ((line=br.readLine())!=null)
{
//正则关联数据
Matcher m=p.matcher(line);
//寻找匹配邮箱
while (m.find())
{
System.out.println(m.group());//输出匹配邮箱
}
}
}

//获取指定文档中的邮件地址。使用获取功能。Pattern  Matcher
public static void getFileMail()throws Exception
{
//将文件封装成对象
File file=new File("E:\\Java Study\\Practice\\day25\\mail.txt");
//创建带缓冲区的读取流
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;

//定义正则表达式
String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";

c9aa
//创建Pattern对象,封装正则表达式
Pattern p=Pattern.compile(regex);

//读取文件中数据
while ((line=br.readLine())!=null)
{

//关流字符串
Matcher m=p.matcher(line);
while (m.find())//寻找匹配的字符串
{
System.out.println(m.group());//输出匹配的字符串
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  正则表达式 操作