A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 胡天杭 于 2014-8-26 13:37 编辑

我的csdn原帖:http://blog.csdn.net/zhangyugehu/article/details/38778285

1、认识正则表达式:

用来处理字符串,字符串处理利器。比如用于邮箱格式判断等等

2、MetaCharacters

正则表达式元字符,利用这些元字符来组合成要筛选的字符串格式。

3、简单概念
  1. <pre name="code" class="java">package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 //简单概念
  7.                 print("简单概念");
  8.                 String regExpCmd="....";
  9.                 String str="haha";
  10.                 Pattern p=Pattern.compile(regExpCmd);
  11.                 Matcher m=p.matcher(str);
  12.                 print(m.matches());
  13.         }
  14. public static void print(Object obj) {
  15.         System.out.println(obj);
  16. }
  17. }
复制代码


4、初步认识

以上代码意思,判断类似“....”这样的四个字符的字符串,其中“.”就是元字符,用来代替一个字符。先生成Pattern的静态方法compile()来录入用于判断的元字符,在实例化Matcher并向下转型为Pattern,用他的matcher()方法来把要判断的字符串和元字符格式进行对比,在调用Matcher的natches()获取判断结果。matches的返回值类型是bool型。
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                
  7.                 //初步认识用于判断的元字符
  8.                 print("a".matches("."));
  9.                 print("aa".matches("aa"));
  10.                 print("aaaa".matches("a*"));
  11.                 print("aaaa".matches("a+"));
  12.                 print("".matches("a*"));
  13.                 print("aaaa".matches("a?"));
  14.                 print("".matches("a?"));
  15.                 print("a".matches("a?"));
  16.                 print("2132434342332".matches("\\d{3,100}"));
  17.                 print("192.168.1.aaa".matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}"));
  18.                 print("192.".matches("[0-2][0-9][0-9]"));
  19.                
  20.         }
  21. public static void print(Object obj) {
  22.         System.out.println(obj);
  23. }
  24. }

复制代码


以上展示了部分元字符的语法用途,如:“.”代表一个字符,“a*”中*代表一个或多个前面的元字符格式,这边是一个或多个a的意思,“a?”中?代表0或多个前面的元字符格式,这里表示0个或多个a,“\\d{3,100}”这种“\\d{n,m}”格式中\\d是一位数字的意思,{n,m}是指定前面格式字符的数量是大于n个,小于m个,{n,}意思是大于n个,以此类推,所以这句的意思是有3到100个数字。更多语法可在jdk api中查看。

5、范围
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
复制代码


"[abc]"代表"[]"中的任何一个,"[]"中的^代表取反,"|"代表或,"&&"代表且。


6、认识\s \w \d \
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 print("\n\r\t".matches("\\s{4}"));
  7.                 print(" ".matches("\\S"));
  8.                 print("a_8".matches("\\w{3}"));
  9.                 print("abc888&^%".matches("[a-z]{1,3}\\d+[&^%#$]+"));
  10.                 print("\\".matches("\\"));
  11.         }
  12. public static void print(Object obj) {
  13.         System.out.println(obj);
  14. }
  15. }
复制代码


"\"在java里回合后面一个字符合成转义字符,所以上面这些就好理解了。
"{a-z}{1,3}\\d+[&^%#$]+"  这一条的意思,首先1到3个a-z之间的字符,后面是一个或多个数字,后面接着一个或多个&^%#$中的一个。

7、边界匹配
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 //边界匹配
  7. print("hello sir".matches("^h.*"));
  8.                 print("hello sir".matches(".*ir[        DISCUZ_CODE_4        ]quot;));
  9.                 print("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
  10.                 print("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
  11.         }
  12. public static void print(Object obj) {
  13.         System.out.println(obj);
  14. }
  15. }
复制代码


这里的^不同于[]中的^,这里是字符开始的意思,如"^h.*"是以h开头后面有一个或多个字符的字符串
$表示结尾。这里的\b是单词边界的意思。

以此类推,我们可以得出空白行的判断表达式 即:"^[\\s&&[^\\n]]*\\n$"。

8、matches  find  lookingAt
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 //matches find &nbsp;lookingAt
  7. Pattern p1=Pattern.compile("\\d{3,5}");
  8. String s="123-21212-234-00";
  9. Matcher m=p.matcher(s);
  10. print(m.matches());
  11. m.reset();
  12. print(m.find());
  13. print(m.find());
  14. print(m.find());
  15. print(m.find());

  16. print(m.lookingAt());
  17. print(m.lookingAt());
  18. print(m.lookingAt());
  19. print(m.lookingAt());
  20.         }
  21. public static void print(Object obj) {
  22.         System.out.println(obj);
  23. }
  24. }
复制代码


这里要说到正则表达式的匹配方式,

正则表达式匹配数据时,会一个一个字符来匹配,并且读过的字符不会回滚,

意思就是如果我用matches()方法匹配到了一个符合条件的诗句就会停下来返回true,

下一次在读取的时候会从上次匹配到的地方接着往下匹配,不会从头再来一遍,

所以在用matches()方法是要小心,可以用reset()方法来重置,让他下次读取重头开始。

find()是找字串,找出一个符合的,下一串接着后面找,不会重头来

lookingAt()是从头开始找。


9、start end

可以用start()和end()方法来输出找到的的匹配的字符串的其实和结束位置。
  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;

  3. public class RegExp {

  4.         public static void main(String[] args) {
  5.                 Pattern p1=Pattern.compile("\\d{3,5}");
  6.                 String s="123-21212-234-00";
  7.                 Matcher m1=p1.matcher(s);
  8.                 print(m1.matches());
  9.                 m1.reset();
  10.                 print(m1.find());
  11.                 print(m1.start()+"-"+m1.end());
  12.                 print(m1.find());
  13.                 print(m1.start()+"-"+m1.end());
  14.                 print(m.find());
  15.                 print(m1.start()+"-"+m1.end());
  16.                 print(m1.find());
  17.                
  18.                 print(m1.lookingAt());
  19.                 print(m1.lookingAt());
  20.                 print(m1.lookingAt());
  21.                 print(m1.lookingAt());
  22.         }
  23. public static void print(Object obj) {
  24.         System.out.println(obj);
  25. }
  26. }
复制代码


10、replacment
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 Pattern p2=Pattern.compile("java",Pattern.CASE_INSENSITIVE);
  7.                 Matcher m2=p2.matcher("java Java JAVa IloveJAVA you hateJava");
  8.                 while(m2.find()){
  9.                         print(m2.replaceAll("JAVA"));}
  10.         }
  11. public static void print(Object obj) {
  12.         System.out.println(obj);
  13. }
  14. }
复制代码


11、分组
  1. package com.stephen.practice;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegExp {

  5.         public static void main(String[] args) {
  6.                 Pattern p3=Pattern.compile("(\\d{3,5})([a-z]{2})");
  7.                 Matcher m3=p3.matcher("123aa-3434rr-123cc-00");
  8.                 while(m3.find()){
  9.                         print(m3.group(1));//打印第一组
  10.                         print(m3.group(2));//打印第二组
  11.                         print(m3.group());//打印第全部
  12.                 }
  13.         }
  14. public static void print(Object obj) {
  15.         System.out.println(obj);
  16. }
  17. }
复制代码


Pattern p3=Pattern.compile("(\\d{3,5})([a-z]{2})");中根据数“(”的个数来确定分了多少组和第几组,默认整个表达式是一组,但不算第一组。

12、Qulifiers

"(.[a-z]{3,10})([0-9])","(.[a-z]{3,10}?)([0-9])","(.[a-z]{3,10}+)([0-9])"的匹配过程区别(greedy qulifiers(X?),Reluctantqulifiers(X??),Possessive qulifiers(X?+))

"(.[a-z]{3,10})([0-9])"先读取10个字符,如果后面的字符不是0-9的数字,则回滚一个字符判断是否是0-9的数字,若不是则一直会滚到第三个字符。
"(.[a-z]{3,10}?)([0-9])"先读取3个字符,判断第四个是不是0-9的数字,如不是则一直往后判断道第10个字符,弱势则匹配成功并退出
"(.[a-z]{3,10}+)([0-9])"读取10个字符,如果后面的字符不是0-9的数字,则匹配失败,并退出

我的csdn原帖:http://blog.csdn.net/zhangyugehu/article/details/38778285

评分

参与人数 2技术分 +2 黑马币 +5 收起 理由
滔哥 + 2
天黑偷牛 + 5 很给力!

查看全部评分

13 个回复

倒序浏览
自己沙发
回复 使用道具 举报
赞一个,好好学!!!
回复 使用道具 举报
believe 发表于 2014-8-26 13:40
赞一个,好好学!!!

好的,么么哒:loveliness:
回复 使用道具 举报
来学习的,可是还没学到正则表达式呢
回复 使用道具 举报
好多 这是笔记还是博客内容啊。
回复 使用道具 举报
戏言丶 发表于 2014-8-26 13:45
来学习的,可是还没学到正则表达式呢

我是之前看论坛上有个正则表达式的题,就去学论文一下QAQ
回复 使用道具 举报
郑飞 发表于 2014-8-26 13:46
好多 这是笔记还是博客内容啊。

是博客的内容?我发错地方了么?@.@
不怎么会玩论坛
求教
回复 使用道具 举报
wfaly 中级黑马 2014-8-26 14:35:15
9#
谢谢 楼主分享...
回复 使用道具 举报
___瘦不了 来自手机 中级黑马 2014-8-26 16:17:37
10#
呃……楼主威武霸气侧漏啊
回复 使用道具 举报
谢谢分享            
回复 使用道具 举报
嗯,不错!!这样的态度。技术分根本不是问题
回复 使用道具 举报
ximi 中级黑马 2014-8-26 20:26:39
13#
不错哦,加油
回复 使用道具 举报
___瘦不了 发表于 2014-8-26 16:17
呃……楼主威武霸气侧漏啊

呃。。我是跟着老师后面敲代码的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马