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

正则表达式

2016-02-29 16:22 260 查看


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
------

正则表达式:符合一定规则的表达式,用于操作字符串。

功能:

1.匹配:boolean matches();如果匹配整个字符串,只要有一处不符合,就匹配结束,返回false。例如:
//检测手机号码,号码格式必须要以13,15,18开头的11位数字
public static void checkTel(String tel) {
String telReg = “1[358]\\d{9}”;
//这串正则表达式的意思就是以数字1开头,3,5,8作为第二位数字。任意数字作为第三位数字并且连续出现9次
boolean b = tel.matches(reg);
System.out.println(b);
}

2.切割:String[] split() 把符合规则的字符串都排除在外。
//例如有一串字符串,中间有多个空格。按照多个空格切
public static void splitDemo(String str) {
String reg = “ +”;//空格出现了一次或者多次的时候,符合正则表达式
String[] arr = str.split(“reg”);
for(String s : arr) {
System.out.println(s);
}

3.替换:String replaceAll(regex, str) 把符合规则的字符串都替换掉
//例如:有一段字符串erkktyqqquizzzzzo。把叠词都替换成#号
String str = “erkktyqqquizzzzzo”;
String reg = “(.)\\1+”; // .代表任意字符,括号括起来的代表为组。\1代表组的编号
str.replaceAll(reg, “#$1”);// $1代表序号为1的组

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

代码示例:
//将一段字符串中,长度为3的单词取出
String str = “ming tian jiu yao fang jia le , da jia”;
String reg = “\\b[a-z]{3}\\b”; // \b代表单词边界符
//将规则封装成对象
Pattern p = Pattern.compile(reg);
//让正则表达式和要作用的字符串关联,获取匹配器对象
Matcher m = p.matcher(str);
while(m.find()) { //find方法会去寻找符合规则的字符串
System.out.println(m.group()); }//group方法为取出


· 思考:正则表达式的4种功能,什么时候该用哪一个呢?

思路方式:

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

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

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

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

 在正则表达式中,有很多表现形式:

常用的有:

字符类:

[abc] : 代表单个字符,这个字符可以是a/b/c中的一个

[^abc] : 代表单个字符,这个字符可以是除了abc的任意一个

[a-zA-Z] :代表单个字符,这个字符是a-z和A-Z中的一个

[a-d[m-p]] :并集的方法

[a-z&&[def]] :交集的方法

 

预定义字符类:

. : 任何字符

\d : 数字[0-9]

\D : 非数字

\s : 空白字符

\S : 非空白字符

\w : 单词字符[a-zA-Z_0-9]

\W : 非单词字符

 

边界匹配器:

^ 行的开头

$ 行的结尾

\b 单词的边界

\B 非单词的边界

 

数量词

X? 一次或者一次没有

X* 零次或者多次

X+ 一次或者多次

X{n} 恰好n次

X{n,} 最少n次

X{n,m} 至少n次,不超过m次

 



被括号括起来是为组,在组的后面有个\n,n就是组的序号。通过$n可以调用组的内容

正则表达式的代码示例:

1. 对邮件地址进行校验

public static void checkMail()
{
String mail = "abc12@sina.com";

mail = "1@1.1";

String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。

//mail.indexOf("@")!=-1

System.out.println(mail.matches(reg));
}
2. 将下列字符串转成:我要学编程
public static void test()
{
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
/*
将已有字符串变成另一个字符串。使用 替换功能。
1,可以先将 . 去掉。
2,再将多个重复的内容变成单个内容。
*/
str = str.replaceAll("\\.+","");

str = str.replaceAll("(.)\\1+","$1");

System.out.println(str);

}


网络爬虫程序:对网页的字符串进行校验,获取有用的信息。比如:别人的邮箱

/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails();
}

public static void getMails()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());
}
}
}

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