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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄茂霖 中级黑马   /  2013-5-12 02:26  /  2553 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 shenqi 于 2013-5-12 02:29 编辑

问:什么是正则表达式?
答:所谓正则表达式(regex)可以理解为符合某种规则的表达式,在Java中专门用来处理字符串的。
那么使用正则表示是究竟有什么好处呢?首先观察如下代码:
//一个检验QQ号码是否合法的程序(没有使用正则表达式):
package cn.itcast.itheima2;
public class RegexTest {
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              System.out.println(new RegexTest().checkQQ("5656247"));
       }
       public boolean checkQQ(String qq){
              //qq号码的规则:5~15位纯数字 首位非0
              //检查长度
              int len = qq.length();
              if(len >=5&&len<=15){
                     //检查首位是否为0
                     if(!qq.startsWith("0")){
                            //检查是否纯数字
                            for(int i=0;i<qq.length();i++){
                                   if(!(qq.charAt(i)>='0' && qq.charAt(i)<='9')){
                                          //如果存在非数字立即返回false
System.out.println(“出现非法字符”)  ;
                                          return false;
                                   }
                            }
                            //也可以使用转换的方式检验是否纯数字
                            /*try{
                                   long l = Long.parseLong(qq);
}catch(NumberFormatException e){
       System.out.println(“出现非法字符”)  ;
}*/
                     }else{
                            System.out.println("首位不能为0");
                            return false;
                     }
              }else{
                     System.out.println("长度错误!");
                     return false;
              }
              return true;
       }
}
以上代码校验QQ号码尤为复杂,如果使用正则表达式检验QQ号码代码则会简洁得多:
package cn.itcast.itheima2;
public class RegexTest {
       public static void main(String[] args) {
System.out.println(new RegexTest().checkQQRegex("56534237"));
       }
      
       public boolean checkQQRegex(String qq){
              //[1-9]表示字符串的第一位的范围1-9的数字
              //[0-9]表示字符串的第二位的范围0-9的数字
              //{4,14}表示第二位开始至少出现4-14个数字
              return qq.matches("[1-9][0-9]{4,14}");
       }
}
显然使用正则表达式更具优越性,正则表达式利用一段特定的符号对字符串进行操作,其底层同样也是利用了复杂的方法写的,只不过我们使用的时候比较爽,学习正则表达式其实就是学习这些特定的符号。正则表达式的单词是regex,位于java..util.regex.Pattern中,在Java se的API文档中可以查看到已经构造好的的匹配符号。
例如:
.
任何字符(与行结束符可能匹配也可能不匹配)
\d
数字:[0-9]
\D
非数字: [^0-9]
\s
空白字符:[ \t\n\x0B\f\r]
\S
非空白字符:[^\s]
\w
单词字符:[a-zA-Z_0-9]
\W
非单词字符:[^\w]
具体可以查看java se的文档。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 辛苦了

查看全部评分

6 个回复

倒序浏览
本帖最后由 shenqi 于 2013-5-12 02:31 编辑

正则表达式不仅仅可以校验字符串、匹配字符串、切割字符串。通常在程序中的应用是检索、替换、查找,例如在Windows打开一个窗口时按ctrl+f出现搜索功能,假如要搜索.jpg格式的图片,通过我们会用*.jpg来查找,这也可以利用正则表达式事先。还有网页爬虫也是利用正则表达式写的。
以下是网页爬虫的简单实现:

  1. package cn.itcast.itheima2;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.FileReader;
  5. import java.io.InputStreamReader;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. public class WebpageReptile {
  9.        public static void main(String[] args) {
  10.               // TODO Auto-generated method stub
  11.               getMail();
  12.        public static void getMail(){
  13.               try {
  14.                      BufferedReader buf =
  15.                             new BufferedReader(new FileReader("c:\\1.html"));
  16.                      String line = null;
  17.                      //匹配邮件的正则表达式
  18.                      String reg = "\\w+@\\w+(\\.\\w+)+";
  19.                      //将规则封装成Pattern对象
  20.                      Pattern p = Pattern.compile(reg);
  21.                      while((line = buf.readLine())!=null){
  22.                             //匹配器
  23.                             Matcher m = p.matcher(line);
  24.                             while(m.find()){
  25.                                    System.out.print(m.group());
  26.                             }
  27.                             System.out.println();
  28.                      }
  29.               } catch (Exception e) {
  30.                      // TODO: handle exception
  31.                      e.printStackTrace();
  32.               }
  33.        }
  34. }
复制代码
由此可以看出比较复杂的还是正则表达式的特定的字符比较难。
String reg = "\\w+@\\w+(\\.\\w+)+";
http://edu.csdn.net/news/2012822/f21877d69403.shtml



回复 使用道具 举报
昨天有事,现在大致看下,还是不错了,能继续完善最好,一起努力,满25分了
回复 使用道具 举报
好东西啊  不错。。
回复 使用道具 举报
刘茂林 发表于 2013-5-12 10:41
好东西啊  不错。。

你叫刘茂林 不是吧 我也叫茂霖
回复 使用道具 举报
shenqi 发表于 2013-5-12 10:55
你叫刘茂林 不是吧 我也叫茂霖

这么神奇。。。哈哈。。 你是要参加20期的不?
回复 使用道具 举报
刘茂林 发表于 2013-5-12 11:02
这么神奇。。。哈哈。。 你是要参加20期的不?

好吧 其实我是云4
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马