黑马程序员技术交流社区

标题: 正则表达式的问题 [打印本页]

作者: 孙沛    时间: 2012-9-3 15:50
标题: 正则表达式的问题
本帖最后由 孙沛 于 2012-9-3 15:54 编辑

我是新手,请教个问题,别见笑。今天看了点关于正则表达式的知识,遇到了点疑问,如果用正则表达式来检测邮箱的格式,邮箱要以字母开头,包括6~18个字符,包括字母、数字、下划线,要怎么定义规则呢?如下面简单的测试代码,要怎么定义regex呢?
import java.io.*;
class  CheckEmailDemo{
       public static void main(String args[]) {
       CheckEmail();
       }
       public static void CheckEmail()
       {
                       String emailName = null;
                       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                       System.out.print("请输入邮箱号:");
                       try{
                       emailName = br.readLine();
               }catch(Exception e){}
                             String regex = "";//此处要怎么写呢?
                       boolean flag = emailName.matches(regex);
                       if(flag)
                               System.out.println("邮箱地址"+emailName+"格式是正确的。");
                       else
                               System.out.println("邮箱地址"+emailName+"格式是非法的。");        
       }
}


作者: 武庆东    时间: 2012-9-3 16:02
String regex =“^([a-zA-Z0-9]|[._])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+“
([a-zA-Z0-9]|[._])+    数字,大小写字母或者"."或者"_ "  至少要出现一次  ( "|" 是或者的意思)
然后是 @
([a-zA-Z0-9_-])+   数字,大小写字母,"_","- "  至少要出现一次
(\.[a-zA-Z0-9_-])+ 必须要有"." "."后面为  (数字,大小写字母"_""-")至少要出现一次
作者: AngieFans85    时间: 2012-9-3 16:43
  1. /**
  2. * 邮箱要以字母开头,包括6~18个字符,包括字母、数字、下划线
  3. */
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;

  7. public class CheckEmailDemo {

  8.         public static void main(String args[]) {
  9.                 CheckEmail();
  10.         }

  11.         public static void CheckEmail() {
  12.                 String emailName = null;
  13.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  14.                 boolean flag = false;
  15.                 System.out.print("请输入邮箱号:");
  16.                 String regex = "^[a-zA-Z]\\w{5,18}$";// 此处要怎么写呢?
  17.                 try {
  18.                         emailName = br.readLine();
  19.                         flag = emailName.matches(regex);
  20.                         if (flag)
  21.                                 System.out.println("邮箱地址" + emailName + "格式是正确的。");
  22.                         else
  23.                                 System.out.println("邮箱地址" + emailName + "格式是非法的。");
  24.                 } catch (Exception e) {
  25.                         e.printStackTrace();
  26.                 } finally {
  27.                         if (br != null) {
  28.                                 try {
  29.                                         br.close();
  30.                                 } catch (IOException e) {
  31.                                         e.printStackTrace();
  32.                                 }
  33.                         }
  34.                 }
  35.         }

  36. }
复制代码

作者: AngieFans85    时间: 2012-9-3 16:44
对不起.没看完题目,原来是要邮箱的规则.我上面的代码没有完成好邮箱的格式的功能,其他的都完成了,我再改改.
作者: AngieFans85    时间: 2012-9-3 17:02
  1. /**
  2. * 邮箱要以字母开头,包括6~18个字符,包括字母、数字、下划线
  3. */
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;

  7. public class CheckEmailDemo {

  8.         public static void main(String args[]) {
  9.                 CheckEmail();
  10.         }

  11.         public static void CheckEmail() {
  12.                 String emailName = null;
  13.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  14.                 boolean flag = false;
  15.                 System.out.print("请输入邮箱号:");
  16.                 String regex = "^[a-zA-Z][\\w*@\\.\\w{3}]{5,18}$";// 此处要怎么写呢?
  17.                 try {
  18.                         emailName = br.readLine();
  19.                         flag = emailName.matches(regex);
  20.                         if (flag)
  21.                                 System.out.println("邮箱地址" + emailName + "格式是正确的。");
  22.                         else
  23.                                 System.out.println("邮箱地址" + emailName + "格式是非法的。");
  24.                 } catch (Exception e) {
  25.                         e.printStackTrace();
  26.                 } finally {
  27.                         if (br != null) {
  28.                                 try {
  29.                                         br.close();
  30.                                 } catch (IOException e) {
  31.                                         e.printStackTrace();
  32.                                 }
  33.                         }
  34.                 }
  35.         }

  36. }
复制代码
好久不玩正则了,呵呵.
作者: 杨卓儒    时间: 2012-9-3 17:34
本帖最后由 杨卓儒 于 2012-9-3 18:12 编辑

学习了。。。。
作者: AngieFans85    时间: 2012-9-3 17:40
武庆东 发表于 2012-9-3 16:02
String regex =“^([a-zA-Z0-9]|[._])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+“
([a-zA-Z0-9]|[._])+    数 ...

假如将输入邮箱地址的长度控制为6,应该怎么写呢.
作者: 杨卓儒    时间: 2012-9-3 17:51
马镱洵 发表于 2012-9-3 17:40
假如将输入邮箱地址的长度控制为6,应该怎么写呢.

在邮箱名为什么要加"^",这个符号不是用来表示否的意思吗,加了就是除了后面组的意思啊,不明白
作者: 杨卓儒    时间: 2012-9-3 17:53
String regex ="[a-zA-Z0-9_]{6}+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"

这样可以吗,控制邮箱长度为6
作者: AngieFans85    时间: 2012-9-3 17:58
杨卓儒 发表于 2012-9-3 17:51
在邮箱名为什么要加"^",这个符号不是用来表示否的意思吗,加了就是除了后面组的意思啊,不明白 ...

^在中括号外面,就代码是行的开头.
作者: AngieFans85    时间: 2012-9-3 17:59
杨卓儒 发表于 2012-9-3 17:53
String regex ="[a-zA-Z0-9_]{6}+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"

这样可以吗,控制邮箱长度为6 ...

我的意思是总长度为6,例如:
a@.com

就是这样,长度为6,还要有@.xxx的格式.
作者: AngieFans85    时间: 2012-9-3 18:02
杨卓儒 发表于 2012-9-3 17:53
String regex ="[a-zA-Z0-9_]{6}+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"

这样可以吗,控制邮箱长度为6 ...

你这代码很容易就看懂了.但是没有实现功能的,功能是:
要以字母打头,并且要有@.xxx的格式,更重要的是总长度为6.
作者: 杨卓儒    时间: 2012-9-3 18:06
马镱洵 发表于 2012-9-3 17:58
^在中括号外面,就代码是行的开头.

受教了,我在API pattern类中没有找到这个符号的用法啊,求大侠给个阅读资料
作者: 杨卓儒    时间: 2012-9-3 18:08
马镱洵 发表于 2012-9-3 17:58
^在中括号外面,就代码是行的开头.

找到了,原来是边界匹配器中的一员。 受教
作者: 杨卓儒    时间: 2012-9-3 18:11
马镱洵 发表于 2012-9-3 17:59
我的意思是总长度为6,例如:
a@.com


String regex ="^([a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}){6}"

这样?
作者: AngieFans85    时间: 2012-9-3 18:11
杨卓儒 发表于 2012-9-3 18:08
找到了,原来是边界匹配器中的一员。 受教

要以字母打头,并且要有@.xxx的格式,更重要的是总长度为6.

你能完成吗?
作者: AngieFans85    时间: 2012-9-3 18:13
杨卓儒 发表于 2012-9-3 18:11
String regex ="^([a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}){6}"

这样?

不对.
我测试过了,我输入"a@.com",结果无法匹配.
作者: 杨卓儒    时间: 2012-9-3 18:14
马镱洵 发表于 2012-9-3 18:11
要以字母打头,并且要有@.xxx的格式,更重要的是总长度为6.

你能完成吗?

没懂,不要域名了? a@b.com  你意思是 a@.com? 不明白啊
作者: AngieFans85    时间: 2012-9-3 18:15
杨卓儒 发表于 2012-9-3 18:11
String regex ="^([a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}){6}"

这样?

如果不控制总长度,确实非常简单,要控制总长度,我还想不出来该如何做,呵呵.
作者: 杨卓儒    时间: 2012-9-3 18:23
马镱洵 发表于 2012-9-3 18:15
如果不控制总长度,确实非常简单,要控制总长度,我还想不出来该如何做,呵呵. ...

等我吃饭完再搞起,一定有办法
作者: AngieFans85    时间: 2012-9-3 18:23
杨卓儒 发表于 2012-9-3 18:14
没懂,不要域名了?   你意思是 a@.com? 不明白啊

因为是要控制总长度为6.
你不用管什么意思,我就是为了完成这样的小功能而已,太简单的正则写起来也没有意思.
作者: 杨卓儒    时间: 2012-9-3 18:39
马镱洵 发表于 2012-9-3 18:23
因为是要控制总长度为6.
你不用管什么意思,我就是为了完成这样的小功能而已,太简单的正则写起来也没有意 ...
  1. if(emailName.length>6)
  2. {
  3.     flag=false;
  4.     return;
  5. }
  6. else
  7. {
  8.    flag=emailName.matches(regex);
  9. }
复制代码
呵呵,这不就完了啊
作者: AngieFans85    时间: 2012-9-3 18:43
杨卓儒 发表于 2012-9-3 18:39
呵呵,这不就完了啊

你的正则表达式呢,可不是只控制总长度啊,你看功能需求:
1 所要匹配的字符串的总长度为6.
2 第一个字符只能为字母.
3 要有@.xxx的格式.
作者: 杨卓儒    时间: 2012-9-3 18:49
本帖最后由 杨卓儒 于 2012-9-3 18:52 编辑
  1. if(emailName.length()>6)
  2. {
  3.     flag=false;
  4.     return;
  5. }
  6. else
  7. {
  8.    flag=emailName.matches(^[a-zA-Z0-9_]+@\\.[a-zA-Z]{3}$);
  9. }
复制代码
这次验证你那个还不行的话 我直播吃S
作者: 杨卓儒    时间: 2012-9-3 18:50
马镱洵 发表于 2012-9-3 18:43
你的正则表达式呢,可不是只控制总长度啊,你看功能需求:
1 所要匹配的字符串的总长度为6.
2 第一个字符只 ...

试试上面的行不
作者: AngieFans85    时间: 2012-9-3 18:53
本帖最后由 马镱洵 于 2012-9-3 18:56 编辑
杨卓儒 发表于 2012-9-3 18:50
试试上面的行不


输入"a@.com"确实可以.
但是输入大于6个字符还是可以,比如输入a3@.com也还可以,这样就不对了.
说明你的总长度也没有控制为6的.
作者: 杨卓儒    时间: 2012-9-3 18:55
马镱洵 发表于 2012-9-3 18:53
输入"a@.com"确实可以.
但是输入大于6个字符就不行了,比如输入"a3@.com"就不行.
说明你的总长度也没有控 ...

ca , 明明可以啊,我这里输入的a3@.com 就显示的false  
作者: 杨卓儒    时间: 2012-9-3 18:56
马镱洵 发表于 2012-9-3 18:53
输入"a@.com"确实可以.
但是输入大于6个字符还是可以,比如输入a3@.com也还可以,这样就不对了.
说明你的总 ...



作者: AngieFans85    时间: 2012-9-3 18:58
杨卓儒 发表于 2012-9-3 18:55
ca , 明明可以啊,我这里输入的a3@.com 就显示的false

上面是我说反了,我要的就是总长度只能是6啊.
作者: 杨卓儒    时间: 2012-9-3 18:58
马镱洵 发表于 2012-9-3 18:53
输入"a@.com"确实可以.
但是输入大于6个字符还是可以,比如输入a3@.com也还可以,这样就不对了.
说明你的总 ...

大哥,你输出的是什么啊 要输出flag啊,不输flag当然不提示是对是错了,我忘记加上去了
作者: AngieFans85    时间: 2012-9-3 18:59
杨卓儒 发表于 2012-9-3 18:55
ca , 明明可以啊,我这里输入的a3@.com 就显示的false

把那个加号去掉就可以了.
作者: 杨卓儒    时间: 2012-9-3 19:00
本帖最后由 杨卓儒 于 2012-9-3 19:07 编辑
马镱洵 发表于 2012-9-3 18:53
输入"a@.com"确实可以.
但是输入大于6个字符还是可以,比如输入a3@.com也还可以,这样就不对了.
说明你的总 ...

完整版来了

  1. class  mailDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 mail();
  6.         }

  7.         public static void mail()
  8.         {
  9.                 String mailName ="a3@.com";
  10.                 System.out.println(mailName);
  11.                 if(mailName.length()>6)
  12.                 {
  13.                         System.out.println(false);
  14.                         return;
  15.                 }
  16.                 else
  17.                 {
  18.                         String reg ="^[a-zA-Z0-9_]+@\\.[a-zA-Z]{3}+[        DISCUZ_CODE_0        ]quot;;
  19.                         System.out.println(mailName.matches(reg));
  20.                 }
  21.         }
  22. }
复制代码

作者: AngieFans85    时间: 2012-9-3 19:01
杨卓儒 发表于 2012-9-3 18:55
ca , 明明可以啊,我这里输入的a3@.com 就显示的false

"[a-zA-Z]{3}"

你这样就写死了,这样就代表"a@.com"中的com只能为三个字符了,万一人家是二个字符呢,比如说"cn",这样怎么办呢.
作者: 杨卓儒    时间: 2012-9-3 19:02
马镱洵 发表于 2012-9-3 18:59
把那个加号去掉就可以了.

嗯,但是不碍事儿,如果你输俩com直接大于6了,false了
作者: AngieFans85    时间: 2012-9-3 19:04
杨卓儒 发表于 2012-9-3 18:58
大哥,你输出的是什么啊 要输出flag啊,不输flag当然不提示是对是错了,我忘记加上去了 ...
  1. /**
  2. * 邮箱要以字母开头,包括6~18个字符,包括字母、数字、下划线
  3. */
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;

  7. public class CheckEmailDemo {

  8.         public static void main(String args[]) {
  9.                 CheckEmail();
  10.         }

  11.         public static void CheckEmail() {
  12.                 String emailName = null;
  13.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  14.                 boolean flag = false;
  15.                 System.out.print("请输入邮箱号:");
  16.                 String regex = "(^[a-zA-Z0-9_]+@\\.[a-zA-Z]{3}$)";// 此处要怎么写呢?

  17.                 // String regex = "^([a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}){6}";
  18.                 try {
  19.                         emailName = br.readLine();
  20.                         flag = emailName.matches(regex);
  21.                         if (flag)
  22.                                 System.out.println("邮箱地址" + emailName + "格式是正确的。");
  23.                         else
  24.                                 System.out.println("邮箱地址" + emailName + "格式是非法的。");
  25.                 } catch (Exception e) {
  26.                         e.printStackTrace();
  27.                 } finally {
  28.                         if (br != null) {
  29.                                 try {
  30.                                         br.close();
  31.                                 } catch (IOException e) {
  32.                                         e.printStackTrace();
  33.                                 }
  34.                         }
  35.                 }
  36.         }

  37. }
复制代码
C:\Documents and Settings\Administrator\桌面\QQ截图20120903190322.jpg
作者: 杨卓儒    时间: 2012-9-3 19:04
马镱洵 发表于 2012-9-3 19:01
"[a-zA-Z]{3}"

你这样就写死了,这样就代表"a@.com"中的com只能为三个字符了,万一人家是二个字符呢,比如 ...

吧{3}改成{1,}不就完了啊,谢谢你让我水到中级黑马了,嘿嘿
作者: AngieFans85    时间: 2012-9-3 19:07
杨卓儒 发表于 2012-9-3 18:58
大哥,你输出的是什么啊 要输出flag啊,不输flag当然不提示是对是错了,我忘记加上去了 ...

你把这代码拷贝过去吧,在控制台输入a3@.com吧,保证也是true的,这样就不是把长度控制为6了.
不过你刚刚的正则表达式中,只要把加号去掉,就可以保证控制为6的长度了.但是这样叫写死了,如果最后的字母不是com,而是cn呢,那你这正则表达式又不能用了.
作者: AngieFans85    时间: 2012-9-3 19:11
杨卓儒 发表于 2012-9-3 19:04
吧{3}改成{1,}不就完了啊,谢谢你让我水到中级黑马了,嘿嘿

{3}改为{1,}
那么你输入"a@.cn"也是正确的,你要知道"a@.cn"只有5个字符啊,我是要控制在6个字符啊.
作者: AngieFans85    时间: 2012-9-3 19:22
杨卓儒 发表于 2012-9-3 19:00
完整版来了

验证长度还玩什么正则,输入输入长度不为6的字符串,就不通过正则来匹配,那还研究个啥啊.我摆明了就是在研究正则啊.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2