0

我有字符串user@domain:port

我想从这个字符串中获取用户、域和端口。

所以我创建了正则表达式:

public static final String MATCH_USER_DOMAIN_PORT = "^([0-9,a-zA-Z-.*_]+)@([a-z0-9]+[\\.-][a-z0-9]+\\.[a-z]{2,}+):(6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3})$";

到目前为止,这是我在 Unitest 中的方法:

public void test____matchesUserDomainWithPort(){

     String identityText = "maxim@domain.com:5555";
        String user = "";
        String domain = "";
        String port = "";

        if(identityText.matches(MATCH_USER_DOMAIN_PORT))
        {                                
            Pattern p = Pattern.compile(MATCH_USER_DOMAIN_PORT);
            Matcher m = p.matcher(identityText);

            user = m.group(1);
            domain= m.group(2);
            port= m.group(3);
        }

    assertEquals("maxim", user);
    assertEquals("domain.com", domain);
    assertEquals("5555", port);

}

我得到错误:

 java.lang.IllegalStateException: No successful match so far
 at java.util.regex.Matcher.ensureMatch(Matcher.java:607)
 ....

在排队:user = m.group(1);

我打开了http://gskinner.com/RegExr/?2v5r0

一切似乎都很好:

输出:

RegExp: /^([0-9,a-zA-Z-.*_]+@[a-z0-9]+([\.-][a-z0-9]+)*)+\.[a-z]{2,}+:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})$/
pattern: ^([0-9,a-zA-Z-.*_]+@[a-z0-9]+([\.-][a-z0-9]+)*)+\.[a-z]{2,}+:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})$
flags: 
3 capturing groups: 
   group 1: ([0-9,a-zA-Z-.*_]+@[a-z0-9]+([\.-][a-z0-9]+)*)
   group 2: ([\.-][a-z0-9]+)
   group 3: (6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})

我错过了什么吗?

C我只是写:sscanf(identityText,"%[^@]@%[^:]:%511s",user,domain,port);

当然,我可以用 and 分割这个文本@:获得 3 个值,但有趣的是如何以温和的形式做到这一点:)

请帮忙

4

2 回答 2

1

请用

if(identityText.matches(MATCH_USER_DOMAIN_PORT)){                                
     Pattern p = Pattern.compile(MATCH_USER_DOMAIN_PORT);
     Matcher m = p.matcher(identityText);
     while(m.find()){
        user = m.group(1);
        domain= m.group(2);
        port= m.group(3);
    }
} 

谢谢

于 2013-04-16T12:39:56.703 回答
0

是的,我认为你的正则表达式是错误的。

public static final String MATCH_USER_DOMAIN_PORT = "^([0-9,a-zA-Z-.*_]+@[a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}+:(6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3})$";

分解它:

  • ^(
  • [0-9,a-zA-Z-.*_]+
    • 任意数量的这些字符,将匹配“maxim”
  • @
    • 将匹配“@”
  • [a-z0-9]+
    • 任意数量的这些字符,将匹配“域”
  • ([\\.-][a-z0-9]+)*
    • 将匹配“.com”(或者理论上是“.somethingelse.com”,很好)
  • )+
    • 我相信,将使第 2 组成为“maxim@domain.com”,但是“+”是什么?
  • \\.
    • 此处输入字符串中没有任何内容
  • [a-z]{2,}+
    • 这是像 .eu 这样的国家代码吗?再次,“+”是什么?
  • :
  • (6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3})
    • 似乎过于复杂 - 可能不使用正则表达式进行数字验证
  • $

查看使用正则表达式验证电子邮件地址,了解有关验证电子邮件地址的一些建议。

于 2013-04-16T12:41:50.193 回答