为清楚起见,我创建了这个:
http://rubular.com/r/ejYgKSufD4
我的字符串:
http://blablalba.com/foo/bar_soap/foo/dir2
http://blablalba.com/foo/bar_soap/dir
http://blablalba.com/foo/bar_soap
我的正则表达式:
\/foo\/(.*)
返回:
/foo/bar_soap/dir/dir2
/foo/bar_soap/dir
/foo/bar_soap
但我只想要
/foo/bar_soap
我是如何实现这一目标的?如上图所示,我希望foo之后的所有内容都可以直到第一个正斜杠。
提前致谢。
编辑。我只希望foo
之后的文本直到下一个正斜杠之后。某些目录也可能被命名为foo
,这会导致错误的结果。感谢
答案 0 :(得分:2)
.
会匹配任何内容,因此您应该将其更改为[^/]
(而不是斜杠):
\/foo\/([^\/]*)
其他一些答案使用+
代替*
。这可能是正确的,取决于你想做什么。使用+
强制正则表达式匹配至少一个非斜杠字符,因此该URL不匹配,因为斜杠后面没有尾随字符:
使用*
将允许匹配,因为它匹配“零或更多”非斜杠字符。因此,您是否应该使用+
或*
取决于您希望允许的匹配项。
的更新强> 的
如果您想过滤掉query strings,也可以过滤?
,它必须位于所有查询字符串的前面。 (我认为您在下面发布的示例实际上缺少前导?
):
\/foo\/([^?\/]*)
但是,不是推出自己的解决方案,最好只使用split
from the URI module。您可以使用URI::split
获取网址的路径部分,然后使用String#split
将其拆分为/
,然后抓住第一个。{1}}。这将处理URL的所有奇怪情况。您可能尚未使用的是具有指定片段的URL,例如:
您需要将#
添加到过滤字符类中以处理这些内容。
答案 1 :(得分:1)
\/foo\/([^\/]+)
[^\/]+
为您提供一系列不是正斜杠的字符。
括号使正则表达式引擎将匹配的内容存储在组([^\/]+)
中,因此您可以从bar_soap
的整个匹配中获得/foo/bar_soap
例如,在javascript中,您将获得匹配的组,如下所示:
regexp = /\/foo\/([^\/]+)/ ;
match = regexp.exec("/foo/bar_soap/dir");
console.log(match[1]); // prints bar_soap
答案 2 :(得分:1)
您可以尝试使用此正则表达式
/\/foo\/([^\/]+)/