如何在Java中处理以下PHP正则表达式?

时间:2011-07-16 11:33:18

标签: java php regex

如何在Java中处理以下PHP正则表达式:

if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }

顺便说一句,这一行是以下功能的一部分:

function getheaders($req){
  $r=$h=$o=null;
  if(preg_match("/GET (.*) HTTP/"   ,$req,$match)){ $r=$match[1]; }
  if(preg_match("/Host: (.*)\r\n/"  ,$req,$match)){ $h=$match[1]; }
  if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
  if(preg_match("/Sec-WebSocket-Key2: (.*)\r\n/",$req,$match)){ $key2=$match[1]; }
  if(preg_match("/Sec-WebSocket-Key1: (.*)\r\n/",$req,$match)){ $key1=$match[1]; }
  if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
  return array($r,$h,$o,$key1,$key2,$data);
}

提前致谢!

到目前为止,我有:

Matcher matcher = Pattern.compile("\r\n(.*?)\\$").matcher(req);
while(matcher.find()){
    data = matcher.group(1);
}
但是,我确信这是错误的。

好的,谢谢你的答案,但他们还没有帮助。但是,我可以请你告诉我这个正则表达式意味着什么:

  if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }

我知道,如果它确实在字符串/\r\n(.*?)\$/中找到与$req匹配的内容,它会将不同类型的数学保存到数组$match中。但是:这里匹配的是什么? $match[0]$match[1]之间有什么区别?也许,如果我理解这一点,我将能够重建在Java中产生相同结果的方法。

感谢Jaroslav,但是:

我正在尝试处理的字符串(Google Chrome发送给我的握手的最后一行是:

Cookie: 34ad04df964553fb6017b93d35dccd5f=%7C34%7C36%7C37%7C40%7C41%7C42%7C43%7C44%7C45%7C46%7C47%7C48%7C49%7C50%7C52%7C53%7C54%7C55%7C56%7C57%7C58%7C59%7C60%7C61%7C62%7C63%7C64%7C65%7C66%7C67%7C68%7C69%7C70%7C71%7C72%7C73%7C74%7C75%7C76%7C77%7C78%7C79%7C80%7C81%7C82%7C83%7C84%7C85%7C86%7C87%7C88%7C89%7C90%7C91%7C92%7C93%7C94%7C95%7C96%7C97%7C98%7C99%7C100%7C101%7C102%7C103%7C104%7C105%7C106%7C107%7C108%7C109%7C110%7C111%7C112%7C113%7C114%7C115%7C116%7C117%7C118%7C119%7C120%7C121%7C122%7C123%7C124%7C125%7C126%7C127%7C128%7C129%7C130%7C131%7C132%7C133%7C134%7C135%7C136%7C137%7C138%7C139%7C%3B%7C%3B%7C%3B%7C%3B1%3B2%3B3%3B4%3B5%3B6%3B7%3B8%3B9%3B10%3B11%3B14%3B15%3B18%3B23%3B24%3B25%3B26%3B28%3B29%3B30%3B31%3B32%3B33%3B%7C
嘿伙计们,我刚才意识到我一直在问的是无关紧要的:(但有一个答案是正确的。

2 个答案:

答案 0 :(得分:1)

使用java.util.regex.Pattern查看here获取此课程的说明。这是Regular Expressions Tutorial。这是一个例子:

String p = "Host: (.*)\\r\\n";
String input = "Host: example.com\r\n";
Pattern pattern = Pattern.compile(p);
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
  String output = matcher.group(1);
    System.out.println(output);
} else {
    System.out.println("not found");
}

注意:Matcher.find匹配子序列,Matcher.matches匹配整个区域。 当您的输入是多行并且您一次解析它时,最后的示例\\$中的恕我直言可能会导致问题。

在Java中,有更方便的方法来访问标头。在客户端,这是HttpURLConnection.getHeaderField。在服务器端有HttpServletRequest.getHeader

答案 1 :(得分:0)

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

public class SplitDemo2 {

    private static final String REGEX = "/\\r\\n(.*?)\\$/";
    private static final String INPUT = "/GET (.*) HTTP/";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT); // get a matcher object
        int count = 0;

        while(m.find()) {
          count++;
          System.out.println("Match number "+count);
          System.out.println("start(): "+m.start());
          System.out.println("end(): "+m.end());
   }
}

}

有关正则表达式http://download.oracle.com/javase/tutorial/essential/regex/matcher.html

的更多信息

你的正则表达式的解释

\r\n(.*?)\$

\ r回车符。

\ n换行符。

(。*?)编号的捕获组

\ $匹配$字符。