如何捕获两个标记之间的文本?
为清楚起见,我创造了这个:如何捕获两个标记之间的文本?
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\/([^\/]*)
一些其他的答案中使用+
代替*
。这可能是正确的,取决于你想要做什么。使用+
强制的正则表达式匹配至少一个非反斜杠字符,所以这个URL将不匹配,因为没有斜杠后尾随字符:
使用*
而不是将允许匹配因为它匹配“零个或多个”非斜杠字符。因此,您是否应该使用+
或*
取决于您想要允许的匹配项。
更新
如果您想筛选出query strings过,你也可以过滤对?
,必须付出所有查询字符串的前面。 (我想你贴在下面的例子中实际上缺少龙头?
):
\/foo\/([^?\/]*)
然而,而不是推出了自己的解决方案,它可能会更好只使用split
from the URI module。您可以使用URI::split
获取路径部分的URL,然后使用String#split
将其拆分为/
,并抓住第一个。这将处理URL的所有奇怪情况。一个你可能还没有,虽然的又是有指定片段,例如:
您需要添加#
到您的过滤字符类来处理这些还有一个URL。
\/foo\/([^\/]+)
[^\/]+
给你一个系列是不是正斜杠字符。
括号会导致正则表达式引擎匹配的内容存储一组([^\/]+)
中,这样你就可以得到bar_soap
出/foo/bar_soap
例如,在整场比赛中的JavaScript,你会得到匹配的组如下:
regexp = /\/foo\/([^\/]+)/ ;
match = regexp.exec("/foo/bar_soap/dir");
console.log(match[1]); // prints bar_soap
这个工作,但需要进一步调整。如果我有/ foo/bar_soap/foo,foo也会返回。我只想在富文本之后直到第一个标记(而不是忽略正斜杠)为止的文本。 – Nadine 2013-03-05 16:15:19
这听起来像是你正在参加整场比赛,但应该抓住第一个匹配的组合,在你的例子中这将是'bar_soap'。你在用什么语言? – 2013-03-05 16:19:29
你可以试试这个正则表达式
/\/foo\/([^\/]+)/
这工作完美。将在7分钟内接受。谢谢!! :) – Nadine 2013-03-05 16:18:38
零或更多是我想要匹配。感谢您扩大解释。我刚刚测试了它对我的完整数据集,它返回了我想要的比赛:) – Nadine 2013-03-05 16:23:18
/富/ bar_soap&stupidarg =奶酪 - 任何想法我可以过滤出来,直到&stupidarg =奶酪?所以再次,使用你的例子返回/ foo/bar_soap&stupidarg =奶酪,但我只想/ foo/bar_soap – Nadine 2013-03-05 16:26:18