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

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 に答える