如何在两个标记之间捕获文本?

时间:2013-03-05 16:11:29

标签: regex

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

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,这会导致错误的结果。感谢

3 个答案:

答案 0 :(得分:2)

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

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

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

http://blablalba.com/foo/

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

更新

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

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

但是,不是推出自己的解决方案,最好只使用split from the URI module。您可以使用URI::split获取网址的路径部分,然后使用String#split将其拆分为/,然后抓住第一个。{1}}。这将处理URL的所有奇怪情况。您可能尚未使用的是具有指定片段的URL,例如:

http://blablalba.com/foo#bar

您需要将#添加到过滤字符类中以处理这些内容。

答案 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\/([^\/]+)/