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

来源:互联网 发布:手机直播软件大全 编辑:程序博客网 时间:2024/06/05 11:42

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

正则表达式

正则表达式。就是符合某种规则的表达式

正则表达式用于操作字符串数据。(针对于字符串)

通过一些特定的符号来体现的。所以我们为了掌握正则表达式,必须要学习一些符号。虽然简化了,但是阅读性差。 

一些符号:

[1-9]代表从1到9数字中的一个,[0-9]{2,16}代表0到9数字中的2个到16个

[abc]代表a、b 或 c(简单类)[^abc] 任何字符,除了 a、b , c 

[a-zA-Z]代表a 到 z 或 A 到 Z,两头的字母包括在内(范围)

\d 数字:[0-9] 

\D 非数字: [^0-9] 

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

\W 非单词字符:[^\w] 

\b 单词边界 

x+表示x一次或多次

x*表示x零次或多次

.表示任意字符

正则表达式对字符串的常见操作:

1, 匹配。其实使用的就是String类中的matches方法。

2,切割。其实使用的就是String类中的split方法。 

3,替换。其实使用的就是String类中的replaceAll()方法。

4,获取。用pattern来完成

获取步骤:将正则规则进行对象的封装

Pattern p = Pattern.compile("a*b");//a*b就是正则规则

//通过正则对象的matcher方法和字符串相关联。获取要对字符串操作的匹配器对象Matcher 

 Matcher m = p.matcher("aaaaab");

 //通过Matcher匹配器对象的方法对字符串进行操作。

 boolean b = m.matches();

 Matcher中的一些方法:

boolean find()查找匹配的子序列

start()第一个坐标,end()最后一个坐标

groud()使用之前必须先find(),获取匹配的子序列

public class RegexDemo2 {//演示匹配。public static void functionDemo_1(){//匹配手机号码是否正确。 String tel = "15800001111";String regex = "1[358]\\d{9}";   boolean b = tel.matches(regex);System.out.println(tel+":"+b);}//演示切割public static void functionDemo_2(){String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";//将叠词作为分隔符就是tttt mmmmmm作为分隔符String[] names = str.split("(.)\\1+");//这(.)表示第一组,有一个以上的组,而这个组代表任意字符,所以切的时候就是按照有一个一上的字符来切for(String name : names){System.out.println(name);}}//演示替换public static void functionDemo_3() {String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";str = str.replaceAll("(.)\\1+", "$1");//美元符号是对前一个参数进行获取System.out.println(str);//zhangsantxiaoqiangmzhaoliuString tel = "15800001111";//158****1111;//(前三个数组是一组,中间四个是一组,后面四个是一组,,)tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//(\\d{3})代表前三个这一组,因为里面都是数字,所以这样System.out.println(tel);}//演示获取public  static void functionDemo_4() {String str = "da jia hao,ming tian bu fang jia!";String regex = "\\b[a-z]{3}\\b";//单词边界//1,将正则封装成对象。Pattern p = Pattern.compile(regex);//2, 通过正则对象获取匹配器对象。 Matcher m = p.matcher(str);//使用Matcher对象的方法对字符串进行操作。//既然要获取三个字母组成的单词 //查找。 find();System.out.println(str);while(m.find()){System.out.println(m.group());//获取匹配的子序列(获取之前得查找,所以得find())System.out.println(m.start()+":"+m.end());}}public static void main(String[] args) {//匹配functionDemo_1();//切割functionDemo_2();//替换functionDemo_3();//获取functionDemo_4();}}

练习:

public class RegexTest {/** * @param args */public static void main(String[] args) {/* * 1,治疗口吃:我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程 * 2,对ip地址排序。  * 3,对邮件地址校验。  */test_3();}//对邮件地址校验。public static void test_3() {String mail = "abc1@sina.com.cn";String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";//这个规则一般不这么写,有他的规则。。且一般都是六到十二位的名字,这里就是举个例子regex = "\\w+@\\w+(\\.\\w+)+";//1@1.1//这是笼统式的方式\w就是[a-zA-Z0-9_]boolean b = mail.matches(regex);System.out.println(mail+":"+b);}/* * 1,治口吃。 */public static void test_1(){String str = "我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程";//1,将字符串中.去掉。 用替换。str = str.replaceAll("\\.+", "");System.out.println(str);//2,替换叠词。str = str.replaceAll("(.)\\1+", "$1");System.out.println(str);}/* * ip地址排序。  *  * 192.168.10.34 127.0.0.1 3.3.3.3  105.70.11.55 */public static void test_2(){String ip_str = "192.168.10.34  127.0.0.1  3.3.3.3  105.70.11.55";//1,为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。//所以,补零,按照每一位所需做多0进行补充。每一段都加两个0.ip_str = ip_str.replaceAll("(\\d+)", "00$1");System.out.println(ip_str);//然后每一段保留数字3位。ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");System.out.println(ip_str);//1,将ip地址切出。String[] ips = ip_str.split(" +");TreeSet<String> ts = new TreeSet<String>();for(String  ip : ips){//System.out.println(ip);ts.add(ip);}for(String ip : ts){System.out.println(ip.replaceAll("0*(\\d+)", "$1"));}}}
爬取邮箱地址。 

public class RegexTest2 {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {List<String> list = getMailsByWeb();for(String mail : list){System.out.println(mail);}}public static List<String> getMailsByWeb() throws IOException {//这是网络的//1,读取源文件。//BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");//与本地以比较只是源变了,这是自己本地的tomcat服务器,将其改为百度:http://baidu.com就是爬网络的了BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.String mail_regex = "\\w+@\\w+(\\.\\w+)+";List<String> list = new ArrayList<String>();Pattern p = Pattern.compile(mail_regex);String line = null;while((line=bufIn.readLine())!=null){Matcher m = p.matcher(line);while(m.find()){//3,将符合规则的数据存储到集合中。list.add(m.group());}}return list;}public static List<String>  getMails() throws IOException{//这是爬取本地的//1,读取源文件。BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));//2,对读取的数据进行规则的匹配。从中获取符合规则的数据.String mail_regex = "\\w+@\\w+(\\.\\w+)+";List<String> list = new ArrayList<String>();Pattern p = Pattern.compile(mail_regex);String line = null;while((line=bufr.readLine())!=null){Matcher m = p.matcher(line);while(m.find()){//3,将符合规则的数据存储到集合中。list.add(m.group());}}return list;}}

0 0
原创粉丝点击