正则表达式

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

25 正则表达式

25.1什么是正则表达式

正则表达式就是具有一定规则的字符串,正则表达式是用操作字符串的。

正则表达式的规则:

如:

[123],表示某一位必须是123.

[a-zA-Z]表示某一位必须是AZ的大小写字母。

[a-m[q-z]]表示某一位必须是a-mq-z小写字母。

[a-z&&[^def]]表示某一位必须是a-z除了def.的小写字母。

[a-z&&[^l-q]]表示某一位必须是a-z除了l-q的小写字母。

[^012]表示某一位不能是012数字。

[a-z&&[def]]表示某一位只能是def小写字母。

预定义字符

\d表示0-9数字。

\D表示[^0-9]

\w表示[a-zA-Z_0-9]

\W表示不能是大小写字母,数字和下划线:[^\w]

\s表示空白字符

\S表示不能是空白字符:[^\s]

.表示任意字符。

注意:在使用下面有反斜线的表达式时,,因为反斜线属于转义字符,必须要再加上一个反斜线对其进行转意。如:

“\\d”.

 

边界匹配器

^

行的开头

$

行的结尾

\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, 匹配

调用String类的matches(String regex);方法,用字符串和指定的正则进行匹配。返回值为boolean,为true表示字符串和正则表达式相匹配,否则不匹配。

如:

 

定义匹配手机号的正则表达式:要求,第一位不能是0,第二位只能是3458

public class RegexDemo {
      public static void main(String[] args) {
             String regex="1[3458]\\d{9}";

             String str="13834530020";

             System.out.println(str.matches(regex));//true     

      }

}


匹配用户名:要求,不能以数字开头,必须是515位。

public class RegexDemo {
      public static void main(String[] args) {

             String regex="[^\\d][\\w]{4,14}";

             String str="michlejackson";

             String str1="00abcdef";

             System.out.println(str.matches(regex));//true

             System.out.println(str1.matches(regex));     //false

             

      }

}

 

2, 切割

调用String类中的String[] split(String regex);方法对字符按指定的正则表达式进行切割,返回一个字符串数组。

如:

public class RegexDemo {

      public static void main(String[] args) {

//将包含不固定数量空格的姓名字符串,将空格去除。

             String str="zhangsan      lisi  wangcai";

             String regex=" +";//表示空格数出现一次或多次。

             String [] arr=str.split(regex);

             for(String s:arr){

                    System.out.println(s);
             }
      }
}

/*打印结果:

zhangsan

lisi

wangcai

*/

public class RegexDemo {
      public static void main(String[] args) {

             //将姓名字符串中的字线去除。

             String str="张三ooooooo李四bbbbb旺财";

             String regex="(.)\\1+";//将任意字符定义为组,第二位使用重复第一组内容,重复一次或多次。

             String [] arr=str.split(regex);

             for(String s:arr){

                    System.out.println(s);
             }
      }
}

/*打印结果:

张三

李四

旺财

*/


3,替换

调用 String类中的replaceAll(String regex,String str);用指定的字符串,替换匹配指定正则表达式的字符串。

如:

public class RegexDemo {

 

      public static void main(String[] args) {

             //将姓名字符串中的一人叠词替换多个叠词。

             String str="张三ooooooo李四bbbbb旺财";

             String regex="(.)\\1+";//将任意字符定义成组,第二位重复第一位的内容,重复多次。

             str=str.replaceAll(regex, "$1");//$1表示,使用第一组的内容。

             System.out.println(str);
      }
}

/*打印结果:

张三o李四b旺财

*/

4,获取

要获取匹配正则表达式的字符串,需要调用Matcher对象中的group()方法,所以这里可以先将正则表达式封装成Pattern对象,再通过此对象的matcher(String str)方法,获取Matcher对象。

如:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexDemo {

      public static void main(String[] args) {
             
             //获取字符串中三个字母的字符串。

             String str="abc fafa afaei ppp opo ip oopp oe4 33 eee iii";

             Pattern  p=Pattern.compile("\\b[a-z0-9]{3}\\b");

             Matcher m=p.matcher(str);

             while(m.find()){

                    System.out.println(m.group());
             }
      }
}

/*

打印结果:

abc

ppp

opo

oe4

eee

iii

*/


 

练习:

1.   去除字符串中重复的汉字。

import java.util.regex.Matcher;

import java.util.regex.Pattern;
 

public class RegexDemo {
      public static void main(String[] args) {

             

             String str="我我...我我...我我...要要...要要要学学学学学.......学编.编编编....编编编..程程程..程程程程";

             String regex_1="\\.+";

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

             str=str.replaceAll(regex_1, "");

             str=str.replaceAll(regex_2, "$1");

             System.out.println(str);
      }
}

/*

打印结果:

我要学编程

 

*/

 


2,IP地址排序

192.168.1.234 127.0.0.1 10.0.2.1 4.3.3.3

 

思路:可以先将其被零,再去零,让IP地址的长度相等,去除中间的空格,遍历数组,再添加到TreeSet集合中,完成自然排序。最后再去除多余的零 

import java.util.TreeSet;

public class RegexDemo {

      public static void main(String[] args) {
             String str="192.168.1.234 127.0.0.1 10.0.2.1 4.3.3.3";

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

             System.out.println(str);

             str=str.replaceAll("0*(\\d{3})","$1");

             System.out.println(str);

             String[]str_arr=str.split(" ");

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

             for(String s:str_arr){

                    ts.add(s);

                    System.out.println(s);

             }

             for(String s:ts){

                    s=s.replaceAll("0*(\\d+)","$1");

                    System.out.println(s);
             }
      }

}

/*

打印结果:

4.3.3.3

10.0.2.1

127.0.0.1

192.168.1.234

 

*/

 

3,邮箱验证

import java.util.TreeSet;

public class RegexDemo {

      public static void main(String[] args) {

             String mail="H_123@sina.com.cn";

             String regex="[\\w]+@[\\w]+(\\.\\w+)+";

             System.out.println(mail.matches(regex));

      }

}


3,网页爬虫

通过指定正则获取网页中的数据。

如:爬取网页中的邮箱。

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class RegexDemo {

 

      public static void main(String[] args)throws IOException {

             URL url=new URL("http://tieba.baidu.com/f?kw=%D3%CA%CF%E4");

             URLConnection urlconn=url.openConnection();

             BufferedInputStream bis=new BufferedInputStream(urlconn.getInputStream());

             byte[]buf=newbyte[1024];

             int len=0;

             String regex="[\\w]+@[\\w]+(\\.\\w+)+";

             Pattern p=Pattern.compile(regex);

             

             while((len=bis.read(buf))!=-1){

                    String data=new String(buf,0,len);

                    Matcher m=p.matcher(data);

                    if(m.find()){

                           System.out.println(m.group());
                    }
             }
             bis.close();
      }

}

 
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值