regexp来切掉可选的尾部
什么正则表达式可以将下面的任何一行作为输入regexp来切掉可选的尾部,regex,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 一般来说,我有一个任意URL,它总是以“rtsp://”开头,并且可以选择以EOL、“/”、“rtsp/1.0”或“/s
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,即不需要可选的尾部
谢谢。这正是您刚才要求的:
$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');
这正是你刚才要求的:
$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');
你在找这样的东西吗:
^rtsp://([^/]+)
然后将其替换为“
$1/9C8CE56C490F2C87
”?您是否正在寻找类似以下内容:
^rtsp://([^/]+)
然后将其替换为“
$1/9C8CE56C490F2C87
”?这应该捕获服务器名称
/rtsp:\/\/([^\/]+)/
从新需求(这将删除尾随):
这一个捕获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
这将捕获服务器名称
/rtsp:\/\/([^\/]+)/
从新需求(这将删除尾随):
这一个捕获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
您可以与以下内容相匹配:
(.*?)(\/streamid\=65335)?(\/)?( RTSP\/1.0)?(\n)?$
并且只读取第一组
根据您使用的语言,使用字符串处理可能更为清晰。例如,在Python中:
for suffix in ('\n', ' RTSP/1.0', '/streamid=65335', '/'):
if url.endswith(suffix):
url= url[:-len(suffix)]
您可以与以下内容相匹配:
(.*?)(\/streamid\=65335)?(\/)?( RTSP\/1.0)?(\n)?$
并且只读取第一组
根据您使用的语言,使用字符串处理可能更为清晰。例如,在Python中:
for suffix in ('\n', ' RTSP/1.0', '/streamid=65335', '/'):
if url.endswith(suffix):
url= url[:-len(suffix)]
根据你的新标准,我认为你不需要正则表达式 编辑:删除了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()
解决方案。这样,您可以根据不同的查询更改长度。根据您的新条件,我认为您不需要正则表达式
编辑:删除了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()
解决方案。这样,您就可以根据不同的查询更改长度。没有一个输入URL包含“9C8CE56C490F2C87”,那么您从哪里得到它呢?我认为你需要更好地解释你的问题。你能澄清一下吗。应该匹配的模式是什么?甚至“*”也可以用来匹配任何一行。请再次查看我在顶部编辑的帖子。2个问题——1)有时尾随/是重要的。你可能需要它吗?2) streamid=65335是上一个示例中url的一部分。您需要吗?我发布了一个perl正则表达式解决方案,它可以工作吗,还是需要使用另一种语言。没有一个输入URL包含“9C8CE56C490F2C87”,那么您从哪里得到它?我认为你需要更好地解释你的问题。你能澄清一下吗。应该匹配的模式是什么?甚至“*”也可以用来匹配任何一行。请再次查看我在顶部编辑的帖子。2个问题——1)有时尾随/是重要的。你可能需要它吗?2) streamid=65335是上一个示例中url的一部分。你需要吗?我发布了一个perl正则表达式解决方案,它可以工作吗,还是需要另一种语言。我需要整个URL,而不仅仅是服务器。但是URL没有所有的尾部。请再次查看顶部我编辑的文章。我需要整个URL,而不仅仅是服务器。但是URL没有所有的尾部。请再次查看顶部我编辑的帖子。我需要完整的URL。但是URL没有所有的尾部。请再次查看顶部我编辑的帖子。我需要完整的URL。但是URL没有所有的尾部。请看我在上面编辑的帖子。抱歉,我正在使用GNU C库ReXEX功能,但是我使用GNU C库ReXeFACE功能,他同意在这种情况下不应该看正则表达式,但是他用C(或C++)来计算它的价值。我同意他不应该在这个例子中看正则表达式,但是他用C(或者C++)来计算它的价值。