Регулярное выражение либо / или не соответствует всему - PullRequest
0 голосов
/ 27 апреля 2010

Я пытаюсь проанализировать HTTP-запрос GET, чтобы определить, содержит ли URL какой-либо из нескольких типов файлов. Если это произойдет, я хочу захватить весь запрос. Есть что-то, чего я не понимаю в ORing.

Следующее регулярное выражение захватывает только его часть, и только если .flv является первым int в списке значений ORd.

(я скрыл URL-адреса пробелами, потому что Stackoverflow ограничивает гиперссылки)

регулярное выражение:

GET.*?(\.flv)|(\.mp4)|(\.avi).*?

текст теста:

GET http: // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy

вывод совпадения:

GET http: // foo.server.com/download/0/37/3000016511/.flv

Я не понимаю, почему. *? в конце регулярное выражение не успокаивает его, чтобы захватить весь текст. Если я избавлюсь от ORing типов файлов, то это работает.

Вот код теста на тот случай, если мое объяснение не имеет смысла:

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String sourcestring = "GET http: // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy";
  Pattern re = Pattern.compile("GET .*?\\.flv.*");  // this works
    //output:
    // [0][0] = GET http :// foo.server.com/download/0/37/3000016511/.flv?mt=video/xy

  // the match from the following ends with the ".flv", not the entire url.
  // also it only works if .flv is the first of the 3 ORd options
  //Pattern re = Pattern.compile("GET .*?(\\.flv)|(\\.mp4)|(\\.avi).*?");
   // output:
   //[0][0] = GET http: // foo.server.com/download/0/37/3000016511/.flv
   // [0][1] = .flv
   // [0][2] = null
   // [0][3] = null

Matcher m = re.matcher(sourcestring);
int mIdx = 0;
  while (m.find()){
    for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
      System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
    }
    mIdx++;
  }

} } * * Тысяча двадцать-один

Ответы [ 2 ]

6 голосов
/ 27 апреля 2010

У вас неправильная группировка. | должно быть в скобках:

GET.*?(\.flv|\.mp4|\.avi).*?

Я также не уверен, почему у вас есть ? в конце финала .*?. В большинстве языков? здесь делает * не жадным, поэтому он сопоставляет как можно меньше символов, не мешая сопоставлению шаблона. В этом случае это будет означать, что он не соответствует ни одному символу, поскольку за ним ничего не следует, поэтому вы, вероятно, хотите удалить этот финал?.

GET .*?(\.flv|\.mp4|\.avi).*
0 голосов
/ 27 апреля 2010

Прежде всего, ваше регулярное выражение выглядит так:

GET.*?(\.flv)  |  (\.mp4)  |  (\.avi).*?

(пробелы добавлены для ясности). Попробуйте это так:

GET.*?(\.flv|\.mp4|\.avi).*?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...