Какое регулярное выражение используется для получения токена URL? - PullRequest
4 голосов
/ 16 августа 2010

Скажем, у меня есть такие строки:

bunch of other html<a href="http://domain.com/133742/The_Token_I_Want.zip" more html and stuff
bunch of other html<a href="http://domain.com/12345/another_token.zip" more html and stuff
bunch of other html<a href="http://domain.com/0981723/YET_ANOTHER_TOKEN.zip" more html and stuff

Какое регулярное выражение соответствует The_Token_I_Want, another_token, YET_ANOTHER_TOKEN?

Ответы [ 7 ]

3 голосов
/ 16 августа 2010

Приложение B из RFC 2396 дает несколько регулярных выражений для разбиения URI на его компоненты, и мы можем адаптировать его для вашего случая

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*/([^.]+)[^?#]*)(\?([^#]*))?(#(.*))?
                                     #######

Это оставляет The_Token_I_Want в $6, что является подвыражением «выделено хэш-линией» выше. (Обратите внимание, что хэши не являются частью шаблона.) Смотрите его вживую:

#! /usr/bin/perl

$_ = "http://domain.com/133742/The_Token_I_Want.zip";    
if (m!^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*/([^.]+)[^?#]*)(\?([^#]*))?(#(.*))?!) {
  print "$6\n";
}
else {
  print "no match\n";
}

Выход:

$ ./prog.pl
The_Token_I_Want

ОБНОВЛЕНИЕ: Я вижу в комментарии, что вы используете boost::regex, поэтому не забывайте избегать обратной косой черты в вашей программе C ++.

#include <boost/foreach.hpp>
#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
  boost::regex token("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*"
                     "/([^.]+)"
                   //  ####### I CAN HAZ HASHDERLINE PLZ
                     "[^?#]*)(\\?([^#]*))?(#(.*))?");

  const char * const urls[] = {
    "http://domain.com/133742/The_Token_I_Want.zip",
    "http://domain.com/12345/another_token.zip",
    "http://domain.com/0981723/YET_ANOTHER_TOKEN.zip",
  };

  BOOST_FOREACH(const char *url, urls) {
    std::cout << url << ":\n";

    std::string t;
    boost::cmatch m;
    if (boost::regex_match(url, m, token))
      t = m[6];
    else
      t = "<no match>";

    std::cout << "  - " << m[6] << '\n';
  }

  return 0;
}

Выход:

http://domain.com/133742/The_Token_I_Want.zip:
  - The_Token_I_Want
http://domain.com/12345/another_token.zip:
  - another_token
http://domain.com/0981723/YET_ANOTHER_TOKEN.zip:
  - YET_ANOTHER_TOKEN
1 голос
/ 16 августа 2010

Вы можете использовать:

(http|ftp)+://[[:alnum:]./_]+/([[:alnum:]._-]+).[[:alnum:]_-]+

([[:alnum:]._-]+) - это группа для сопоставленного шаблона, и в вашем примере ее значение будет The_Token_I_Want. чтобы получить доступ к этой группе, используйте \ 2 или $ 2, потому что (http|ftp) является первой группой и ([[:alnum:]._-]+) - вторая группа сопоставленного шаблона.

1 голос
/ 16 августа 2010
/a href="http://domain.com/[0-9]+/([a-zA-Z_]+).zip"/

Возможно, вы захотите добавить больше символов в [a-zA-Z _] +

1 голос
/ 16 августа 2010

Попробуйте это:

/ (?: е | ХТ) ТПС: / {2} (?: WWW.) Домен [^ /] + ([^ /] +) ([^ /] +) / я *?.. 1003 *

или

/ \ ш {3,5}: / {2} (ш ?: {3}.) Области [^ /] + ([^ /] +) ([^ /] +) / я?..

0 голосов
/ 16 августа 2010

Вероятно, лучше использовать что-то умнее, чем RegEx. Например, если вы используете C #, вы можете использовать класс System.Uri для его анализа.

0 голосов
/ 16 августа 2010
m/The_Token_I_Want/

Вы должны быть более точными в том, что это за токен. Число? Строка? Это повторяется? Есть ли у него форма или рисунок?

0 голосов
/ 16 августа 2010

Сначала воспользуйтесь парсером HTML и получите DOM. Затем возьмите элементы привязки и зациклите их в поисках ссылок. Не пытайтесь извлечь токен прямо из строки.

Тогда:

Глупый ответ будет:

/(The_Token_I_Want.zip)/

Возможно, вы захотите быть немного более точным, чем один пример.

Полагаю, вы действительно ищете:

/([^/]+)$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...