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

How do I process following PHP regex in Java:

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

This line is part of following function, by the way:

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

Thanks in advance!

So far I have:

Matcher matcher = Pattern.compile("
(.*?)\\$").matcher(req);
while(matcher.find()){
    data = matcher.group(1);
}

I am sure, however, that this is wrong.

Ok guys, thanks for your answers, but they did not help yet. May I ask you to tell me, however, what this regex means:

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

I know, that if it does find a match with / (.*?)\$/ in the string $req, it will save the different kinds of mathces into the array $match. BUT: what is being matched here? And what's the difference between $match[0] and $match[1]? Maybe, if I understand this, I will be able to reconstruct the way to produce equal results in Java.

Thanks Jaroslav, but:

The string I am trying to process however (the last line of the handshake sent to me by Google Chrome, is:

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

Hey guys, I just now realize what I have been asking was irrelevant :( But one answer has been right.

duanjiao3754
duanjiao3754 pastebin.com/FjBnxepE这里:D但事实上,我真的不知道处理过程中需要哪一部分,我不知道在哪里可以找到。只有我知道,它适用于PHPWebSocket。顺便说一句:我把所有其他标题都搞定了,这很容易;)我只是不知道如何处理最后一行:D
大约 9 年之前 回复
dtz30833
dtz30833 你能不能把你得到的字符串粘贴(如果有的话有换行符)并告诉我你想得到什么部分/部分。
大约 9 年之前 回复
donglu5728
donglu5728 谢谢,zacheusz,这很有趣,但问题是:它不是一个简单的标题,但我必须以某种方式处理该标题。我不需要拿整个标题,但要么是它的最后一个字节(根据维基百科)或者phpwebsocket所做的任何事情,然后处理它以获得我的共鸣(WebSocket不容易:D)
大约 9 年之前 回复
duanhuan2301
duanhuan2301 看起来你不必使用正则表达式。在Java中,有更方便的方法来访问标头。查看我更新的响应以获取详细信息。
大约 9 年之前 回复
dtkz3186
dtkz3186 尝试在最后删除\\$-虽然您的输入超过一行可能会导致问题
大约 9 年之前 回复
dssnh86244
dssnh86244 Matcher.find按序列进行匹配。你应该逃避特殊字符-请看下面的例子。尝试缓存已编译的Pattern(不是每次都编译它)以提高性能。
大约 9 年之前 回复
dp518158
dp518158 到目前为止你有什么?
大约 9 年之前 回复

2个回答



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

public class SplitDemo2 {

私有静态最终字符串REGEX =“/\\
(。*?)\ $ /”;
私有静态最终字符串INPUT =“/ GET(。*)HTTP /”; \ n
public static void main(String [] args){
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); //获取匹配器对象
int count = 0;

while(m.find()){
count ++;
System.out.println(“匹配号”+计数);
系统。 out.println(“start():”+ m.start());
System.out.println(“end():”+ m.end());
}
}
</ 代码> </ pre>

} </ p>

有关正则表达式的更多信息 http://download.oracle.com/javase/tutorial/essential/regex/matcher.html </ p>

解释 你的正则表达式</ p>

 

(。*?)\ $
</ code> </ pre>



回车符。 </ p>


换行符。</ p>

(。*?)编号的捕获组</ p>

\ $ 匹配$字符。</ p>
</ div>

展开原文

原文

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

public class SplitDemo2 {

    private static final String REGEX = "/\\
(.*?)\\$/";
    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());
   }
}

}

More info on regex http://download.oracle.com/javase/tutorial/essential/regex/matcher.html

Explanation of your regex


(.*?)\$

Carriage return character.

Line break character.

(.*?) A numbered capture group

\$ Matches a $ character.

dongmuyan5638
dongmuyan5638 谢谢。 但有一些东西,请看我更新的问题:。*? 甚至没有出现在那里。
大约 9 年之前 回复
doujin4031
doujin4031 它没有。 你可以在这里检查你的表达regexplanet.com/simple/index.html我刚刚写下了如何做Java。
大约 9 年之前 回复
doupu7651
doupu7651 并且:这个(。*?)表达式意味着什么? 这不是我试图理解的代码,而是phpwebsocket的代码。
大约 9 年之前 回复
dongqiulei6805
dongqiulei6805 不幸的是,没有找到使用此表达式的内容
大约 9 年之前 回复
douhe1002
douhe1002 这个例子是不正确的,它甚至不能用Java来编写
大约 9 年之前 回复



使用 java.util.regex.Pattern </ code>查看这里有关此课程的说明。 这是正则表达式教程。 以下是示例:</ p>

  String p =“Host:(。*)\ \
”;
String input =“Host:example.com

“;
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”);
}
</ code> </ pre>

注意: Matcher.find </ code>匹配子序列, Matcher.matches </ code>匹配整个区域。
示例 \ $ </ code>中的
IMHO最后可能会导致问题 您的输入是多行的,您可以立即解析它。</ p>

在Java中,有更方便的方法来访问标题。 在客户端,这是 HttpURLConnection.getHeaderField </ code>。 在服务器端有 HttpServletRequest.getHeader </ code>。</ p>
</ div>

展开原文

原文

Use java.util.regex.Pattern look here for instructions for this class. Here is Regular Expressions Tutorial. And here is the example:

String p = "Host: (.*)\\
";
String input = "Host: example.com
";
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");
}

Note: Matcher.find matches subsequences, Matcher.matches matches entire region. IMHO in your example \\$ at the end may cause a problem when your input is multiline and you parse it at once.

In Java there are more convenient methods for accessing headers. At client side this is HttpURLConnection.getHeaderField. At the server side there is HttpServletRequest.getHeader.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问