java - 如何使用Java中的模式来获取像C中的 'sscanf'那样的组?

标签 java pattern-matching

我有字符串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);

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

请帮忙

最佳答案

请使用

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);
    }
} 

谢谢

关于java - 如何使用Java中的模式来获取像C中的 'sscanf'那样的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16037124/

相关文章:

java - 我可以将 java portlet 添加到现有的 java Web 应用程序吗?

scala - 追加到列表模式匹配

android - 如何从单个字符串中获取多个匹配的模式

java - 将不同的模式与字符串匹配

java - 使用 Java 获取最近播放的 iTunes 歌曲

java - butterknife 库问题

java - 如果另一个计时器事件挂起,ScheduledThreadPoolExecutor 计时器不会触发

javascript - 如何使用 JavaScript 匹配我所在窗口的当前 URL 中的字符串?

rust - 如何放宽对已知变体的嵌套匹配的非详尽模式检查?

java - 为什么 if 语句之后的语句在同步方法中没有按预期运行