黑马程序员--正则表达式
来源:互联网 发布:java药品管理系统 编辑:程序博客网 时间:2024/05/22 04:35
------------android培训、java培训、期待与您交流!--------------
大纲:
一、正则表达式概述
二、正则表达式的基本应用
三、正则表达式对象、匹配器对象(Pattern与Matcher)
四、正则表达式总结
五、对ip地址进行排序。
六、邮箱格式校验
七、网页爬虫
一、正则表达式概述
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
二、正则表达式的基本应用
1、匹配示例代码
需求:手机有11位数字且以13、15、18开头开头,号码不符合规则的返回false
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));
结果返回false因为第二位数字是6不在(3,5,8)之中
2、切割示例代码
(1) String[] arr = "zhangsan.lisi.wangwu".split("\\.");
System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}
返回的数组长度是3,字符串被切割成3份。
(2) String[] arr = "zhangsan lisi wan gwu".split(" +");
返回的数组长度是4,是按一个或多个空格来分割
(3) String[] arr = "c:\\abc\\a.txt".split("\\\\");
数组长度是3
(4)按照叠词切割
String[] arr = "erkktyqqquizzzzzo".split("(.)\\1+");
字符串被切割成er ty ui o
String[] arr = "erkktyqyqquizzzzzo".split("(..)\\1");
字符串被分隔成erkkt qui zo
由此可得出结论在(..)中“.”代表任意字符,()里面的字符是一组,
\\1代表和(..)一样的一组字符,\\1+代表和(..)一样的一组或多组字符。
叠词解析:
按照叠词完成切割是为了可以让规则的结果被重用,可以将规则封装成一个组。
用()完成。组的出现都有编号,从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
String[] arr = "erkktyqqyquizzzzzo".split("(.)(.)\\2"); //前一个字符任意,后两个字符一样
此字符串是按rkk、yqq、izz、zzz切割的,数组长度是5,结果是e t yqu o
3、替换示例代码
(1)String str = we5r1389980000ty1234564uiod234345675f
str = str.replaceAll(”\\d{5,}“,“#”);
str结果是we5r#ty#uiod#f
只有数字连续5个以上的才被#所替换
(2)//将叠词替换成$. 将重叠的字符替换成单个字母。zzzz->z
String str = "erkktyqqquizzzzzo";
str = str.replaceAll("(.)\\1+","$1");
str结果是erktyquizo
str = str.replaceAll("(.)(.)\\2+","$2");str结果是 ektquzo
校验QQ号示例代码:
qq号不能以0开头,是5-15位的数字
1、传统方式
String qq = "1882345a0";int len = qq.length();if (len >= 5 && len <= 15) {if (!qq.startsWith("0"))// Integer.parseInt("12a");NumberFormatException{try {long l = Long.parseLong(qq);System.out.println("qq:" + l);} catch (NumberFormatException e) {System.out.println("出现非法字符.......");}char[] arr = qq.toCharArray();// 123a4boolean 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 qq = "123a454";String regex = "[1-9]\\d{4,14}";boolean flag = qq.matches(regex);if (flag)System.out.println(qq + "...is ok");elseSystem.out.println(qq + "... 不合法")
三、正则表达式对象、匹配器对象(Pattern与Matcher)
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
1、匹配器对象的简单应用
String str = "ming tian jiu yao fang jia le ,da jia。";String reg = "[a-z]{4,}";//将规则封装成对象。Pattern p = Pattern.compile(reg);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m = p.matcher(str);System.out.println(m.matches());
其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
以上代码就等同于str.matches(reg);
只不过被String的方法封装后,用起来较为简单。但是功能却单一。
2、获取:将字符串中的符合规则的子串取出(获取长度是4的单词)
String str = "ming tian jiu yao fang jia le ,dayu jia。";System.out.println(str);String reg = "\\b[a-z]{4}\\b";//将规则封装成对象。Pattern p = Pattern.compile(reg);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m = p.matcher(str);boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。System.out.println(b);System.out.println(m.group());//用于获取匹配后结果。结果是ming,\\b保证取出的是单词。
3、将长度为4的单词全部取出
String str = "ming tian jiu yao fang jia le ,dayu jia。";System.out.println(str);String reg = "\\b[a-z]{4}\\b";Pattern p = Pattern.compile(reg);Matcher m = p.matcher(str);while(m.find()){System.out.println(m.group());System.out.println(m.start()+"...."+m.end());}
结果是:
ming
0....4
tian
5....9
fang
18....22
dayu
31....35
解析:m.group()返回的是 m.find()所找到的符合规则的单词,此单词的下标
开始是m.start() 结束是 m.end()-1
四、正则表达式总结
到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/
按以上思路将下列字符串转成:我要学编程
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";/*将已有字符串变成另一个字符串。使用 替换功能。1,可以先将 . 去掉。2,在将多个重复的内容变成单个内容。*/str = str.replaceAll("\\.+","");System.out.println(str);str = str.replaceAll("(.)\\1+","$1");System.out.println(str);
五、对ip地址进行排序。
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段顺序的排序。
还按照字符串自然顺序,只要让它们每一段都是3位即可。
1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";ip = ip.replaceAll("(\\d+)","00$1");System.out.println(ip);ip = ip.replaceAll("0*(\\d{3})","$1");System.out.println(ip);String[] arr = ip.split(" ");TreeSet<String> ts = new TreeSet<String>();for(String s : arr){ts.add(s);}for(String s : ts){System.out.println(s.replaceAll("0*(\\d+)","$1"));}
六、邮箱格式校验
String mail = "abc12@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。mail = "1@1.1";也能通过
七、网页爬虫
将一个文本里的邮箱全部提取出来
/*网页爬虫(蜘蛛)*/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();}<span style="white-space:pre"></span>//获取网页中的邮箱地址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培训、期待与您交流! --------------
- 黑马程序员-正则表达式
- 黑马程序员 正则表达式
- 黑马程序员:正则表达式
- 黑马程序员---正则表达式
- 黑马程序员:正则表达式
- 黑马程序员--正则表达式
- 黑马程序员--正则表达式
- 黑马程序员--正则表达式
- 黑马程序员--正则表达式
- 黑马程序员 正则表达式
- 黑马程序员-正则表达式
- 黑马程序员:正则表达式
- 黑马程序员-正则表达式
- 黑马程序员 正则表达式
- 黑马程序员---正则表达式
- 黑马程序员---正则表达式
- 黑马程序员-正则表达式
- 黑马程序员--正则表达式
- 这些年计算机学生路总结资料
- Linux性能监控——CPU、Memory、IO、Network
- 客户端下载
- 设计模式(11)--代理模式之RMI
- Java并发编程实战-
- 黑马程序员--正则表达式
- 未来的wifi城市——扬州
- Linux动态频率调节系统CPUFreq
- Crontab的用法(主要针对每天固定时间做什么事)和expect的用法
- 严重: Dispatcher initialization failed Unable to load configuration
- Collection子类对象的特点和方法应用
- tabpanel的setActiveTab()解决按钮重复问题
- easyUI自适应宽度问题
- iOS ----iOS的影片播放 MediaPlayer 和 AVPlayer