您的位置:首页 > 职场人生

黑马程序员——Java基础—正则表达式

2015-01-23 16:26 411 查看

Java基础之正则表达式

正则表达式:可理解为符合一定规则的表达式。

作用:专门用于操作字符串。

特点:用一些特定的符号来表示一些代码操作,可以简化书写。因此,学习正则表达式就是学习一些特殊符号的使用。

好处:可以简化对字符串的复杂操作。弊端:符号定义越多,正则越长,阅读性越差。

具体操作功能:

1.匹配:String的matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

代码示例:

class  RegexDemo
{
public static void main(String[] args)
{
checkTel();
}
/*
练习:对手机号码进行校验。
规定手机号码只有:13xxx , 15xxx , 18xxx 这三个号段的。
长度是11位的。
*/
public static void checkTel()
{
String tel = "15588644488";

String regex = "1[358]\\d{9}";

System.out.println(tel.matches(regex));
}

/*
对QQ号码进行校验
要求:5~15  0不能开头,只能是数字
*/
public static void checkQQ_reg()
{
String qq = "12002531";

String regex = "[1-9]\\d{4,14}";  //定义正则表达式。

System.out.println(qq.matches(regex));
}

//下面的方式也可以完成,但代码量过多,不够简化。学习了正则之后就变得简单多了。
public static void checkQQ()
{
String qq = "65655454";

int len = qq.length();
System.out.println(len);

if(len>=5 && len<=15)
{
if(!qq.startsWith("0"))
{
try
{
Long l = Long.parseLong(qq);
System.out.println("qq:"+qq);
}
catch (NumberFormatException e)
{
System.out.println("出现非法的字符...");
}
/*
char[] arr = qq.toCharArray();

boolean flag = true;
for(int x=0; x<arr.length; x++)
{
if(!(arr[x]>='0' && arr[x]<='9'))
{
flag = false;
break;
}
}
if(flag)
System.out.println("qq:"+qq);
else
System.out.println("请输入正确的数字");
*/
}
else
System.out.println("不能以'0'开头");
}
else
System.out.println("长度错误");
}
}


2.切割:String split(); 

3.替换:String replaceAll(regex,str):使用给定的字符串替换此字符串中所有匹配正则表达式的子字符串。 

如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。 在正则里 .代表任意字符。

在替换当中,可以用"$"来获取到规则里的组。str.replaceAll("(.)\\1+","$1"); "$1"是代表前面规则里的第1个组。 \b 单词边界 。

切割代码示例:

class RegexDemo1
{
public static void main(String[] args)
{
splitDemo("zhangsan  lisi    wangwu"," +");  //X+  X,一次或多次

splitDemo("zhangsan.lisi.wangwu","\\."); //在正则里 .代表任意字符。

splitDemo("d:\\java2014\\day21","\\\\"); //在java中"\"会将后面的字符转义,要成对的出现"\\"

/*
需求:按照叠词完成切割。
为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。
组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的
形式来获取。
*/
splitDemo("dfwwokadddlkqqqqqrw","(.)\\1+");
}
public static void splitDemo(String str,String regex)
{
String[] arr = str.split(regex);

System.out.println(arr.length);

for(String s : arr)
{
System.out.println(s);
}
}
}
替换与组的代码演示:
<span style="white-space:pre">	</span>public static void replaceAllDemo1()
{
//需求:将字符串中出现的叠词替换成单个的"&"。

String str = "dfwwokadddlkqqqqqrw";

String regex = "(.)\\1+";

String newStr = str.replaceAll(regex,"&");

System.out.println(newStr);
}
public static void replaceAllDemo2()
{
//需求:将字符串中重叠的字母替换成单个字母。 zzzz-->z
String str = "dfwwokadddlkqqqqqrw";

String regex = "(.)\\1+";

String newStr = str.replaceAll(regex,"$1");

System.out.println(newStr);
}


正则表达式的第4个功能就是获取:将字符串中符合规则的子串取出。

操作步骤:

1.通过Pattern类的compile方法将正则表达式封装成对象。示例:Pattern p = Pattern.compile(regex); 

2.让正则对象和要操作的字符串相关联。获取匹配器对象。 示例:Matcher m = p.matcher(String); 

3.将规则作用到字符串上,并进行符合规则的子串查找。示例:boolean b = m.find(); m.group():用于获取匹配后结果。代码示例如下:

import java.util.regex.*;
class  RegexDemo3
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "jidu yu zhao hui shi jida de aomi";

String regex = "\\b[a-z]{4}\\b";

//1.将正则表达式封装成对象。
Pattern p = Pattern.compile(regex);

//2.让正则对象和要操作的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);

while(m.find()) //3.进行符合规则的子串查找。
{
//4.获取匹配后结果。
System.out.println(m.group());
}
}
}


正则表达式学习了四种具体的操作功能,在实际的应用中,到底用四种功能中的哪一个呢?或者哪几个呢?

思考方式:

1,如果只想知道该字符串是对是错,使用匹配。

2,想要将已有的字符串变成另一个字符串,使用替换。

3,想要按照指定的方式将字符串变成多个字符串,使用切割。获取规则以外的子串。

4,想要拿到符合规则的字符串子串,使用获取。获取符合规则的子串。

/*
网页爬虫(蜘蛛)。
练习:1.获取指定文档中的邮箱地址。2.获取网页中的邮箱地址。
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;

class  RegexTest1
{
public static void main(String[] args) throws IOException
{
getMail();
}
public static void getMail_1() throws IOException
{
String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

Pattern p = Pattern.compile(regex);

URL url = new URL("http:\\127.0.0.1:10010");

URLConnection conn = url.openConnection();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));

for(String line=null; (line=bufIn.readLine())!=null; )
{
Matcher m = p.matcher(line);

while(m.find())
System.out.println(m.group());
}
}
public static void getMail() throws IOException
{
//需求:获取指定文档中的邮箱地址,使用正则的获取功能。Pattern  Matcher

String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

Pattern p = Pattern.compile(regex);

BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));

for(String line=null; (line=bufr.readLine())!=null;  )
{
Matcher m = p.matcher(line);

while(m.find())
{
System.out.println(m.group());
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: