Java - 正则表达式相互匹配

Java - Regular Expressions matching one to another

我正在尝试使用 RE 检索数据位。问题是我对 RE 不是很流利。考虑代码。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class HTTP{

    private static String getServer(httpresp){
        Pattern p = Pattern.compile("(\bServer)(.*[Server:-\r\n]"); //What RE syntax do I use here?
        Matcher m = p.matcher(httpresp);

        if (m.find()){
            return m.group(2);

    public static void main(String[] args){
        String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n"; //Test data

        System.out.println(getServer(testdata));

如何让 "Server:" 到下一个输出 "Apache" 的“\r\n”?我用谷歌搜索并尝试了自己,但都失败了。

您可以使用捕获组或正面回顾。

Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)");

然后打印组索引1。

示例:

String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n";
Matcher matcher = Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
    System.out.println(matcher.group(1));
}

Matcher matcher = Pattern.compile("(?:\bServer\b\S*\s+)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
    System.out.println(matcher.group(1));
}

输出:

Apache

解释:

  • (?:\bServer:\s*) 在正则表达式中,非捕获组将表示为 (?:...),它只会进行匹配。 \b 称为单词边界,匹配单词字符和非单词字符。 Server: 匹配字符串 Server: 并且后面的零个或多个空格将被 \s*

  • 匹配
  • (.*?) 在正则表达式中 (..) 称为捕获组,它捕获那些与捕获组中存在的模式匹配的字符。在我们的例子中 (.*?) 将非贪婪地捕获所有字符,直到

  • (?=[\r\n]+) 检测到一个或多个换行符。 (?=...) 称为正向先行,它断言匹配后必须跟有与先行内部存在的模式匹配的字符。

这是一条单线:

private static String getServer(httpresp) {
    return httpresp.replaceAll(".*Server: (.*?)\r\n.*", "");
}

这里的技巧分为两部分:

  • 使用.*?,这是一个勉强匹配(消耗尽可能少,仍然匹配)
  • 正则表达式匹配整个输入,但使用反向引用捕获并返回所需的目标