当前位置: 首页 > 知识库问答 >
问题:

HTTP请求的正则表达式在某些情况下不起作用

盖泽宇
2023-03-14
    String somethingPattern = "(.*)?";

    String ipPattern = "(((2[0-4][0-9])|(25[0-5])|(1?[0-9]?[0-9]))\\.((2[0-4][0-9])|(25[0-5])|(1?[0-9]?[0-9]))\\.((2[0-4][0-9])|(25[0-5])|(1?[0-9]?[0-9]))\\.((2[0-4][0-9])|(25[0-5])|(1?[0-9]?[0-9]))|"+somethingPattern+")((:)\\d{3,})?"; // regex for ip varying from 0.0.0.0 to 255.255.255.255 or some string, followed or no by : and a port number 
    String objetoPattern = "([/?a-zA-Z0-9\\.\\-_]+)"; // regex for a linux path to a file, including only letters, numbers and -_.

    String connectionPattern = "(connection:\\s*"+somethingPattern+")?";
    String contentLenPattern = "(content-length:\\s*([0-9]+))?";
    String postmanTokenPattern = "(postman-token:\\s*"+somethingPattern+")?";
    String cacheControlPattern = "(cache-control:\\s*"+somethingPattern+")?";
    String originPattern = "(origin:\\s*"+somethingPattern+")?";
    String userAgentPattern = "(user-agent:\\s*"+somethingPattern+")?";
    String charsetPattern = "(charset="+somethingPattern+")?";
    String contentTypePattern = "(content-type:\\s*"+somethingPattern+";"+charsetPattern+")?";
    String acceptPattern = "(accept:\\s*"+somethingPattern+")?";
    String acceptEncodingPattern = "(accept-encoding:\\s*"+somethingPattern+")?";
    String acceptLanguagePattern = "(accept-language:\\s*"+somethingPattern+")?";


    // (?i) is for the case of coming get, Get, GET... etc...
    String pattern = "^(?i)(get|put|head|post|delete)\\s+?" + objetoPattern + "\\s+?HTTP/1.1\\s+?host:\\s+?" + ipPattern + "\\s+?" + connectionPattern + "\\s+?" + contentLenPattern + "\\s+?" + postmanTokenPattern + "\\s+?" + cacheControlPattern + "\\s+?" + originPattern + "\\s+?" + userAgentPattern + "\\s+?" + contentTypePattern + "\\s+?" + acceptPattern + "\\s+?" + acceptEncodingPattern + "\\s+?" + acceptLanguagePattern + "\\s+?$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(in); // this in is the input string that is the request all joined in a single line string

if(m.find()){
// ......
} else {
  System.out.println("Input didn't match");
}

编辑:处理套接字输入的代码部分:

bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String in = "";
        while((msgDoSocket = bufferedReader.readLine()) != null){
            try {
                in += msgDoSocket + " ";
                if(msgDoSocket.isEmpty()){
                    processaInput(in); // this calls the part that process regex
                }
            } catch (Exception ex) {
                Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

共有1个答案

常自强
2023-03-14

页眉行由换行线分隔,页眉与正文(如果存在)用2个连续的换行线分隔。您应该使用scanner对象,因为它在默认情况下使用换行符分隔标记,这比matcher容易得多。您可以简单地遍历这些行。当您获得这些标题行时,您可以通过“:”对它们进行切片,以形成映射而不是一百万种类型的变量来覆盖所有标题键的可能性。然后您可以简单地检查映射键值以匹配您发送的内容。

此外,您还可以使用Fiddler/Wireshark查看邮递员的原始请求。

这个答案使用reader并按你想要的做。

 类似资料:
  • 我有一个数据框,其中一列有字符串值,另一列有整数,但这些列有特殊字符,或者字符串数据有整数。因此,为了删除它,我使用了regex,我的regex可以正常工作,但是对于整数列,如果'abc123'是,那么它不会删除abc,如果'123abc'是,那么它不会删除它。我不知道是模式错误还是代码错误。下面是我的代码, 输出: 如您所见,它已在

  • 我要匹配以下字符串: 包含unicode空格(不要问我为什么)<代码>/,\s*,/u在regex101中工作正常。 但是(?u),\s*,“在clojure中不起作用: 为什么会失败?

  • 问题内容: 我有一个正则表达式: 这应该与该字符串匹配并返回三个捕获(根据Rubular) 这是我的代码: 当有三个时,此打印输出1(组),所以我只能这样做,只会返回32。 问题答案: 调用查找匹配的 下一个 实例,如果没有更多实例,则返回false。尝试调用它三次,看看是否有所有预期的组。 为了澄清,正在尝试 在正则表达式中 找到第一个组 表达式 。您的正则表达式中只有一个这样的组表达式,因此永

  • 我有以下正则表达式: 这允许: 开头可选 然后是数字、点、逗号、圆括号、破折号和空格。 除此之外,我需要确保数字和加号(如果存在)的长度在9到15之间(所以我不计算符号之外的任何特殊字符)。 最后一个条件是我有问题的地方。 有效输入: 358(9)1234567 无效输入: 3.5 8.9,1-2(3)4.5,6.77777(33个字符,只有20个计数字符(数字和加号)太多) 如果可能的话,使用正

  • 问题内容: 我和我的朋友正在尝试创建一种算法来计算输入的数字之后不会重复的数字(例如)。 感兴趣的代码是: 由于某种原因,即使将其设置为,也将其设置为。每个输出的结果将与输入具有相同的值。 这是什么问题,我们将如何更改逻辑,以便当数字中的数字重复时,检查器返回假? 问题答案: 考虑这些行 有一些问题。我认为您缺少牙套。和你忘了更新checker的时候matcher.find()是假的。我建议你改为

  • 正则表达式非常简单: 这在Neo4j服务器web控制台中有效。我收到了预期的结果。 当我通过Java使用REST接口时,我必须将regex更改为:(添加了反斜杠)。我不明白为什么,但它确实有效(再次返回了预期结果)。 相同的正则表达式不适用于嵌入式Neo4j: 请注意 不会显示在错误日志中(至少在 Intellij 控制台上)。 更糟糕的是< code > "(?我)。* \ \ baaaaaaa