【问题标题】:How do I process following PHP regex in Java?如何在 Java 中处理 PHP 正则表达式?
【发布时间】:2011-07-16 11:33:18
【问题描述】:

如何在 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]; }

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

谢谢雅罗斯拉夫,但是:

我正在尝试处理的字符串(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

大家好,我现在才意识到我一直在问的问题是无关紧要的 :( 但有一个答案是正确的。

【问题讨论】:

  • 到目前为止你有什么?
  • Matcher.find 按序列匹配。您应该转义特殊字符 - 请看下面的示例。还可以尝试缓存已编译的 Pattern(不要每次都编译它)以提高性能。
  • 尝试在末尾删除 \\$ - 虽然您的输入超过一行,但可能会导致问题
  • @arik-so:看起来您不必使用正则表达式。在 Java 中,有更方便的方法来访问标头。详情请查看我的更新回复。
  • 谢谢,zacheusz,这很有趣,但问题是:它不是一个简单的标题,但我必须以某种方式处理该标题。我不需要获取整个标题,而是它的最后 8 个字节(根据维基百科)或 phpwebsocket 所做的任何事情,然后为我的反应处理它(WebSocket 并不容易:D)

标签: java php regex


【解决方案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

【讨论】:

    【解决方案2】:
    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 换行符。

    (.*?) 编号的捕获组

    \$ 匹配 $ 字符。

    【讨论】:

    • 很遗憾,使用此表达式找不到任何内容。
    • 还有:这个 (.*?) 表达式是什么意思?我想理解的不是我的代码,而是 phpwebsocket 的代码。
    • 它没有。你可以在这里查看你的表达regexplanet.com/simple/index.html我刚刚写了Java如何做到这一点。
    • 谢谢。但是有一些东西,请参阅我更新的问题:.*?甚至没有出现在那里。
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多