新线匹配“不匹配”

时间:2015-05-18 19:33:08

标签: java pattern-matching

我正在编写一个java服务器,并始​​终从浏览器中读取请求。例如,我在浏览器http://localhost:8080/great中读取此请求,如

GET /great HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36 OPR/29.0.1795.47
Accept-Encoding: gzip, deflate, lzma, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4

作为我程序的下一步,我需要在GET和HTTP / 1.1之间获取文本。所以,在这种情况下/great我尝试使用匹配器。但它说没有比赛。有谁能解释为什么?

这是一段代码:

  public void run() {
        try {
while(true) {
    in = new BufferedReader(new InputStreamReader(serSock.getInputStream(), Charset.forName("UTF-8")));

    StringBuilder request = new StringBuilder();
    request = new StringBuilder();
    String inputLine;
    while (!(inputLine = in.readLine()).equals("")) {
        request.append(inputLine + "\r\n");
    }
    Pattern pattern = Pattern.compile("(?s)GET(.*)HTTP/1.1:*[\\n\\r].*", Pattern.MULTILINE);

    Matcher matcher = pattern.matcher(request);
   System.out.println(request);


    String rev= matcher.group(1);
    System.out.println(rev);
}
        }
        catch (IOException e) {
            System.out.println(e);
        }
    }
}

我认为问题出在Pattern中。

1 个答案:

答案 0 :(得分:0)

模式应该是Pattern.compile("^GET (.*) HTTP/1\\.1$.*", Pattern.MULTILINE | Pattern.DOTALL)

您的模式中的一些错误:

  • 正如@VGR的评论所述,:*不应该存在,但由于使用了*,它意味着零次或多次出现。在你的情况下,零发生。
  • [\\n\\r],在字符串转义发生后,将[\n\r],这意味着一个字符newline carriage-return。不是都。您应该使用\r\n,而不是[]并按相反顺序使用。但$最好使用。

然而,您不能使正则表达式工作的主要问题是您永远不会调用Matcher对象上的任何匹配方法。在致电matcher.matches()之前,您需要添加find()(或lookingAt()matcher.group(1))。 (我之前应该注意到这一点。)