0

为了清楚起见,我创建了这个:

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,这会导致不正确的结果。谢谢

4

3 回答 3

2

.将匹配任何内容,因此您应该将其更改为[^/](而不是斜线):

\/foo\/([^\/]*)

其他一些答案使用+而不是*. 这可能是正确的,具体取决于您想要做什么。Using+强制正则表达式匹配至少一个非斜杠字符,因此该 URL 将不匹配,因为斜杠后面没有尾随字符:

http://blablalba.com/foo/

使用*相反将允许匹配,因为它匹配“零个或多个”非斜杠字符。因此,您是否应该使用+*取决于您想要允许的匹配项。

更新

如果您也想过滤掉查询字符串,您还可以过滤?,它必须位于所有查询字符串的前面。(我认为您在下面发布的示例实际上缺少前导?):

\/foo\/([^?\/]*)

但是,与其推出自己的解决方案,不如直接split从 URI 模块中使用。您可以使用URI::split获取 URL 的路径部分,然后使用String#split将其拆分为/,并获取第一个。这将处理 URL 的所有奇怪情况。您可能还没有想到的是带有指定片段的 URL ,例如:

http://blablalba.com/foo#bar

您还需要添加#到您的过滤字符类来处理这些。

于 2013-03-05T16:16:36.033 回答
1

\/foo\/([^\/]+)

[^\/]+给你一系列不是正斜杠的字符。

括号导致正则表达式引擎将匹配的内容存储在一个组([^\/]+)中,因此您可以bar_soap退出整个匹配/foo/bar_soap

例如,在 javascript 中,您将获得匹配的组,如下所示:

regexp = /\/foo\/([^\/]+)/ ;
match = regexp.exec("/foo/bar_soap/dir");
console.log(match[1]);  // prints bar_soap
于 2013-03-05T16:13:15.553 回答
1

你可以试试这个正则表达式

/\/foo\/([^\/]+)/
于 2013-03-05T16:13:27.773 回答