什么是正则表达式来确定浏览器名称/版本&操作系统等

时间:2013-11-08 18:49:48

标签: java regex

我尝试编写一些正则表达式来确定客户端设备详细信息,例如操作系统名称,浏览器daetils仍然面临IE浏览器检测问题。

浏览器检测代码:

 public static final BrowserBean getBrowserInfo(String userAgent){
    BrowserBean browserBean = new BrowserBean();
    Pattern pattern = Pattern.compile("(?i)(opera|chrome|safari|firefox|MSIE|trident)(\\s|\\/)(\\d+.\\d+)");
    Matcher matcher = pattern.matcher(userAgent);
    while (matcher.find()) {
        int groupCount = matcher.groupCount();
        if(groupCount >= 3){
        browserBean.setBrowserName(matcher.group(1));
        browserBean.setBrowserVersion(matcher.group(3));
        }
      }
    return browserBean; 
    }

测试用例:

 @Test
    public void detectSafaritest() {
    String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
    BrowserBean bean =  UserAgentDetermination.getBrowserInfo(userAgent);
    Assert.assertEquals("Safari", bean.getBrowserName());
    Assert.assertEquals("537.71", bean.getBrowserVersion());
    }

    @Test
    public void detectIEtest() {
    String userAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; MASP)";
    BrowserBean bean =  UserAgentDetermination.getBrowserInfo(userAgent);
    Assert.assertEquals("InterNet Explorer", bean.getBrowserName());
    Assert.assertEquals("10.0", bean.getBrowserVersion());
    }

    @Test
    public void detectFireFoxtest() {
    String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0";
    BrowserBean bean =  UserAgentDetermination.getBrowserInfo(userAgent);
    Assert.assertEquals("Firefox", bean.getBrowserName());
    Assert.assertEquals("25.0", bean.getBrowserVersion());
    }

//    @Test
//    public void detectOperatest() {
//  String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.71 (KHTML, like Gecko) Version/6.1 Safari/537.71";
//  BrowserBean bean =  UserAgentDetermination.getBrowserInfo(userAgent);
//  Assert.assertEquals("Safari", bean.getBrowserName());
//  Assert.assertEquals("537.71", bean.getBrowserVersion());
//    }

    @Test
    public void detectChrometest() {
    String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36";
    BrowserBean bean =  UserAgentDetermination.getBrowserInfo(userAgent);
    Assert.assertEquals("Chrome", bean.getBrowserName());
    Assert.assertEquals("30.0", bean.getBrowserVersion());
    }

我遇到了IE和三叉戟浏览器的问题,因为我可以看到用户代理打印为: Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; MASP) Mozilla / 5.0(Windows NT 6.3; Trident / 7.0; rv:11.0),如Gecko

请帮我识别IE所有版本。

如果您正在帮我提供设备信息,

将会很感激。

2 个答案:

答案 0 :(得分:0)

您的二传手BrowserBean.setBrowserNameBrowserBean.setBrowserVersion将被调用两次,因为在find循环中使用while可获得多个匹配:

  • MSIE 9.0
  • 三叉戟/ 5.0

假设您的setter只是普通的设置者,Trident匹配将覆盖MSIE匹配。

答案 1 :(得分:-1)

你的正则表达式很好,问题出在你的断言声明中。对于IE,字符串包含“MSIE”,这就是您要查找(并返回)的内容。但是你的断言语句正在寻找字符串“InterNet Explorer”

虽然有一个小问题:正则表达式的最后一部分应该是(\\d+\\.\\d+)而不是(\\d+.\\d+)。这样它将匹配文字.而不是任何单个字符。