我正在编写一个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中。
答案 0 :(得分:0)
模式应该是Pattern.compile("^GET (.*) HTTP/1\\.1$.*", Pattern.MULTILINE | Pattern.DOTALL)
您的模式中的一些错误:
:*
不应该存在,但由于使用了*
,它意味着零次或多次出现。在你的情况下,零发生。[\\n\\r]
,在字符串转义发生后,将[\n\r]
,这意味着一个字符newline
或 carriage-return
。不是都。您应该使用\r\n
,而不是[]
并按相反顺序使用。但$
最好使用。 然而,您不能使正则表达式工作的主要问题是您永远不会调用Matcher
对象上的任何匹配方法。在致电matcher.matches()
之前,您需要添加find()
(或lookingAt()
或matcher.group(1)
)。 (我之前应该注意到这一点。)