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

黑马程序员——Java语言基础——09.正则表达式

2014-12-20 10:29 495 查看


------- android培训java培训、期待与您交流!
----------


1-1 正则表达式概述

正则表达式:符合一定规则的表达式。

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

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

好处:可以简化对字符串的复杂操作。

弊端:符号定义越多,正则越长,阅读性越差。

1-2 常用预定义类

java中正则表达式工具在java.util.regex包中。

字符类
[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](减去)
预定义字符类
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字:
[^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
边界匹配器
^行的开头
$行的结尾
\b单词边界
\B非单词边界
\A输入的开头
\G上一个匹配的结尾
\Z输入的结尾,仅用于最后的结束符(如果有的话)
\z输入的结尾
Greedy 数量词
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好
n 次
X{n,}X,至少
n 次
X{n,m}X,至少
n 次,但是不超过 m 次

1-3 常用操作

1-3-1 匹配

String类中的matches方法。
用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
匹配示例:
class RegexDemo
{
public static void main(String[] args)
{
matchMail();
}

//匹配QQ号
public static void match()
{
String s1 = "12344533333";
String regex = "[1-9][0-9]{4,10}";

if (s1.matches(regex))
{
System.out.println("qq is right");
}
else
{
System.out.println("qq is wrong");
}

}

//匹配手机号
public static void matchPhone()
{
String s1 = "16799990000";
String regex = "[1][358]\\d{9}";//反斜杠,不是斜杠

if (s1.matches(regex))
{
System.out.println("PhoneNumber is right");
}
else
{
System.out.println("PhoneNumber is wrong");
}
}

//匹配邮箱
public static void matchMail()
{
String s1 = "22e@qq.com";
String regex = "\\w+@\\w+(\\.[A-Za-z]+)+";

if (s1.matches(regex))
{
System.out.println("Mail is right");
}
else
{
System.out.println("Mail is wrong");
}

}

}<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">	</span>

1-3-2 切割

String类中的split方法。

切割示例:
class RegexSplit
{
public static void main(String[] args)
{
split4();
}

//切割多个空格
public static void split1()
{
String s1 = "ni si  sjidaj  s";
String regex = " +";

String[] s2 = s1.split(regex);

for (String s : s2)
{
System.out.println(s);
}
}

//切割.因为.是所有字符的通配符,所以必须\转义,反斜杠必须同时出现一对
public static void split2()
{
String s1 = "ni.si.sj.is";
String regex = "\\.";

String[] s2 = s1.split(regex);

for (String s : s2)
{
System.out.println(s);
}
}

//切割反斜杠
public static void split3()
{
String s1 = "ni\\si\\sj\\is";//字符串中出现反斜杠必须同时出现两次
String regex = "\\\\";//因此切割双斜杠也必须出现两次*2

String[] s2 = s1.split(regex);

for (String s : s2)
{
System.out.println(s);
}
}

//切割叠词
public static void split4()
{
String s1 = "niaashhskkd";
String regex = "(\\w)\\1+";

String[] s2 = s1.split(regex);

for (String s : s2)
{
System.out.println(s);
}

}
}

1-3-3 替换

String类中的replaceAll(regex,str);
如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组

组:
用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。
(aaa(wwww(ccc))(eee))有几个组?
小技巧,从左括号开始数,有几个左括号就是几组。
替换示例:class RegexReplace
{
public static void main(String[] args)
{
replace2();
}

public static void replace1()
{
String s1 = "ndfbai1213243ubfi545644ab";
String regex = "[\\d]{4,}";

String s2 = s1.replaceAll(regex,"****");

System.out.println(s2);
}

public static void replace2()
{
String s1 = "ndfbai22222ubfidddddddab";
String regex = "(\\w)\\1+";

//
// String s2 = s1.replaceAll(regex,"*");
String s2 = s1.replaceAll(regex,"$1$1");//美元符号有特殊含义,$1表示获取符合前一个组中的符号,在外面获取组

System.out.println(s2);
}
}

1-3-4 获取

将字符串中的符合规则的子串取出。

操作步骤:

1,将正则表达式封装成对象。

2,让正则对象和要操作的字符串相关联。

3,关联后,获取正则匹配引擎。

4,通过引擎对符合规则的子串进行操作,比如取出。

class RegexGet
{
public static void main(String[] args)
{
get1();
}

public static void get1()
{
String s1 = "dni sjj shhd ssii dai";
String regex = "\\b[a-zA-Z]{3}\\b";

//将regex封装成对象
Pattern p = Pattern.compile(regex);

//将Pattern对象与字符串关联,并获取匹配器对象
Matcher m = p.matcher(s1);

while(m.find())//先找到符合要求的子串
{
String s2 = m.group();//返回之前匹配的子串
System.out.println(s2);
System.out.println(m.start()+" "+m.end());
}
}
}

1-4 正则表达式练习

需求1:将下列字符串转成:我要学编程.
"我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"

到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:

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

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

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

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

public class StringReplace {

public static void main(String[] args) {
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
String temp = str.replaceAll("\\.+", "");//将.替换为空字符
System.out.println(temp);
String d = temp.replaceAll("(.)\\1+", "$1");//美元符号取前一个组中的内容
System.out.println(d);
}

}
需求2:将下列ip地址进行地址段顺序的排序。

192.68.1.254 
102.49.23.13 
10.10.10.10 
2.2.2.2 
8.109.90.30
按照字符串自然顺序,只要让它们每一段都是3位即可。

1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。

2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。

import java.util.TreeSet;

public class RegexDemo {

public static void main(String[] args) {
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
String ip1 = ip.replaceAll("(\\d+)", "00$1");//在所有数字前补两个0
String ip2 = ip1.replaceAll("0*(\\d{3})", "$1");//去除掉多余的一个0,所有数字都是三位
String[] ip3 = ip2.split(" ");

TreeSet<String> ts = new TreeSet<String>();

for (String s : ip3)//存入TreeSet,排序
ts.add(s);
for(String s: ts)
System.out.println(s.replaceAll("0*(\\d+)", "$1"));//去除掉所有多余的0
}

}正则应用,网页爬虫获取网页邮箱
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}

public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254: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.compile(mailreg);

while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}


------- android培训java培训、期待与您交流!
----------

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: