2015-05-18 67 views
0

我正在寫一個java服務器,並總是從瀏覽器讀取請求。例如,我在瀏覽器http://localhost:8080/great及正如我在程序中的下一個步驟,我需要得到GET和HTTP/1.1之間的文本讀起來就像新行匹配器「不匹配」

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 

這一請求。所以,在這種情況下/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); 
     } 
    } 
} 

我認爲這個問題是模式。

+0

我猜你並不是想把':*'放在你的模式中。您的示例請求與任何有效的HTTP請求一樣,在HTTP/1.1之後沒有冒號。 – VGR

+0

我個人可能會對此調用'readLine()',然後使用'.split(「」)'來獲得動詞和URI。模式匹配對於這些微不足道的東西來說是過分的。 – markspace

回答

0

模式也許應該Pattern.compile("^GET (.*) HTTP/1\\.1$.*", Pattern.MULTILINE | Pattern.DOTALL)

一些在你的模式中的錯誤:

  • 爲在@VGR,:*評論不應該有提到,但由於*使用,它意味着零次或多次發生。在你的情況下,零事件。
  • [\\n\\r]其中,後串逸出已經發生,將[\n\r],這意味着字符newlinecarriage-return一個。不是都。您應該只使用\r\n,而不使用[]並按相反的順序。但$更好用。

的主要問題,爲什麼你沒有得到正則表達式的工作然而,你永遠不調用任何Matcher對象的匹配方法。在致電matcher.group(1)之前,您需要添加matcher.matches()(或find()lookingAt())。 (我之前應該已經注意到了這一點)。

+0

我已經編輯了代碼。但是這種模式也行不通。 – Lemmy

+0

我發現了你的真實錯誤並更新了我的答案。 –

+0

是的!這有幫助。謝謝! – Lemmy