正则表达式切断可选的尾巴

时间:2009-03-11 16:45:11

标签: regex

正则表达式可以将以下任何一行作为输入

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

一般情况下,我有一个任意网址,始终以"rtsp://"开头,可选择以EOL"/"" RTSP/1.0""/streamid=65335 RTSP/1.0"结尾。

我只需要获取URL,即没有可选的尾随部分。

感谢。

5 个答案:

答案 0 :(得分:2)

这应该捕获服务器名称。

/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

这个捕获网址:

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 :(得分:1)

这将完全符合您的要求:

$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');

答案 2 :(得分:1)

你可以匹配:

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

并且只读第一组。

根据您使用的语言,使用字符串处理可能更清楚。例如在Python中:

for suffix in ('\n', ' RTSP/1.0', '/streamid=65335', '/'):
    if url.endswith(suffix):
        url= url[:-len(suffix)]

答案 3 :(得分:1)

根据您的新标准,我认为您不需要正则表达式。

编辑:删除了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()解决方案。这样,您可以根据查询来改变查询的长度。

答案 4 :(得分:0)

你在寻找这样的东西:

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

然后将其替换为“$1/9C8CE56C490F2C87”?