2013-03-05 44 views
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,这会导致不正确的结果。由于

回答

2

.将匹配任何东西,所以你应该将其更改为[^/](没有斜杠)代替:

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

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

http://blablalba.com/foo/

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

更新

如果您想筛选出query strings过,你也可以过滤对?,必须付出所有查询字符串的前面。 (我想你贴在下面的例子中实际上缺少龙头?):

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

然而,而不是推出了自己的解决方案,它可能会更好只使用split from the URI module。您可以使用URI::split获取路径部分的URL,然后使用String#split将其拆分为/,并抓住第一个。这将处理URL的所有奇怪情况。一个你可能还没有,虽然的又是有指定片段,例如:

http://blablalba.com/foo#bar

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

+0

这工作完美。将在7分钟内接受。谢谢!! :) – Nadine 2013-03-05 16:18:38

+0

零或更多是我想要匹配。感谢您扩大解释。我刚刚测试了它对我的完整数据集,它返回了我想要的比赛:) – Nadine 2013-03-05 16:23:18

+0

/富/ bar_soap&stupidarg =奶酪 - 任何想法我可以过滤出来,直到&stupidarg =奶酪?所以再次,使用你的例子返回/ foo/bar_soap&stupidarg =奶酪,但我只想/ foo/bar_soap – Nadine 2013-03-05 16:26:18

1

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

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

括号会导致正则表达式引擎匹配的内容存储一组([^\/]+)中,这样你就可以得到bar_soap/foo/bar_soap

例如,在整场比赛中的JavaScript,你会得到匹配的组如下:

regexp = /\/foo\/([^\/]+)/ ; 
match = regexp.exec("/foo/bar_soap/dir"); 
console.log(match[1]); // prints bar_soap 
+0

这个工作,但需要进一步调整。如果我有/ foo/bar_soap/foo,foo也会返回。我只想在富文本之后直到第一个标记(而不是忽略正斜杠)为止的文本。 – Nadine 2013-03-05 16:15:19

+0

这听起来像是你正在参加整场比赛,但应该抓住第一个匹配的组合,在你的例子中这将是'bar_soap'。你在用什么语言? – 2013-03-05 16:19:29

1

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

/\/foo\/([^\/]+)/ 
相关问题