регулярное выражение, чтобы нарезать дополнительный хвост - PullRequest
0 голосов
/ 11 марта 2009

Какое регулярное выражение может принимать любую из следующих строк в качестве ввода

rtsp://server/blabla/bla RTSP/1.0
rtsp://server/blabla/bla/
rtsp://server/blabla/bla
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0

и всегда возвращает:

rtsp://server/blabla/bla

В общем, у меня есть произвольный URL, который всегда начинается с "rtsp://" и, необязательно, заканчивается EOL, "/", " RTSP/1.0" или "/streamid=65335 RTSP/1.0".

Мне нужно получить только URL, т. Е. Без дополнительных конечных частей.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 11 марта 2009

Это должно захватить имя сервера.

/rtsp:\/\/([^\/]+)/

из новых требований (это устраняет трейлинг):

linux ~ $ echo "rtsp://server/blabla/bla RTSP/1.0
rtsp://server/blabla/bla/
rtsp://server/blabla/bla
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0
" | perl -pe 's/( RTSP\/1.0|\/|\/streamid=65335 RTSP\/1\.0)$//g'
rtsp://server/blabla/bla
rtsp://server/blabla/bla
rtsp://server/blabla/bla
rtsp://server/blabla/bla

Этот захватывает URL:

echo "rtsp://server/blabla/bla RTSP/1.0
rtsp://server/blabla/bla/
rtsp://server/blabla/bla
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0
" | perl -pe 's/(.+?)(?: RTSP\/1.0|\/|\/streamid=65335 RTSP\/1\.0)$/\1/'
rtsp://server/blabla/bla
rtsp://server/blabla/bla
rtsp://server/blabla/bla
rtsp://server/blabla/bla
1 голос
/ 11 марта 2009

Исходя из ваших новых критериев, я не думаю, что вам нужно регулярное выражение.

РЕДАКТИРОВАТЬ: Удалено решение Perl, так как вы используете C. Используя C, сделайте следующее:

str[20] = 0; // string is now NUL-terminated to 20 characters
if(!strcmp(str, "rtsp://server/blabla/bla"))
  {
    // do stuff if it matches
  }
else
  {
    // do stuff if it doesn't match
  }

Или, если вы хотите сохранить исходную строку:

if(!strncmp(str, "rtsp://server/blabla/bla", 20)) // only compare 20 chars
  {
    // do stuff if it matches
  }
else
  {
    // do stuff if it doesn't match
  }

Возможно, вы захотите сделать решение strncmp(). Таким образом, вы можете изменять длину запроса для каждого запроса.

1 голос
/ 11 марта 2009

Вы можете сравнить с:

(.*?)(\/streamid\=65335)?(\/)?( RTSP\/1.0)?(\n)?$

и читайте только первую группу.

В зависимости от того, какой язык вы используете, может быть понятнее использовать обработку строк. Например в Python:

for suffix in ('\n', ' RTSP/1.0', '/streamid=65335', '/'):
    if url.endswith(suffix):
        url= url[:-len(suffix)]
1 голос
/ 11 марта 2009

ну, это будет именно то, что вы только что просили:

$pattern = '/rtsp:\/\/server\/.*/'
$replace = 'server/9C8CE56C490F2C87';

preg_replace($pattern, $replace, 'rtsp://server/blabla/bla RTSP/1.0');

Если вы хотите получить все до пробела, это сработает:

$pattern = '/([^ ]+).*/'

preg_replace($pattern, '$1', 'rtsp://server/blabla/bla RTSP/1.0');
0 голосов
/ 11 марта 2009

Вы ищете что-то вроде этого:

^rtsp://([^/]+)

А затем заменить его на «$1/9C8CE56C490F2C87»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...