正则表达式:在url字符串的两个斜杠之间对第二个最后一个值进行子串

时间:2011-12-01 17:00:23

标签: ruby regex url substring

我有一个这样的字符串:

http://www.example.com/value/1234/different-value

如何提取1234

注意:最后可能有一个斜杠:

http://www.example.com/value/1234/different-value
http://www.example.com/value/1234/different-value/

4 个答案:

答案 0 :(得分:4)

/([^/]+)(?=/[^/]+/?$)

应该有效。您可能需要根据您使用的语言对其进行不同的格式化。例如,在Ruby中,它是

if subject =~ /\/([^\/]+)(?=\/[^\/]+\/?\Z)/
    match = $~[1]
else
    match = ""
end

答案 1 :(得分:1)

使用Javascript:

var myregexp = /:\/\/.*?\/.*?\/(\d+)/;
var match = myregexp.exec(subject);
if (match != null) {
    result = match[1];
}

适用于您的示例......但我相信它一般会失败......

Ruby编辑:

if subject =~ /:\/\/.*?\/.*?\/(.+?)\//
    match = $~[1]

does 工作。

答案 2 :(得分:0)

使用切片进行位置提取

如果您始终要从URI中提取第4个元素(包括方案),并确信您的数据是常规数据,则可以使用Array#slice,如下所示。

'http://www.example.com/value/1234/different-value'.split('/').slice 4
#=> "1234"

'http://www.example.com/value/1234/different-value/'.split('/').slice 4
#=> "1234"

无论是否有斜杠,无论是否在分割后有更多 4个元素,以及第四个元素是否始终是严格数字,这都将可靠地工作。它的工作原理是因为它基于元素在路径中的位置,而不是元素的内容。但是,如果您尝试使用较少的元素(例如http://www.example.com/1234/)解析URI,则最终会得到 nil

使用扫描/匹配进行模式提取

或者,如果您知道您要查找的元素始终是唯一一个完全由数字组成的元素,则可以使用带有环视的String#match来仅提取字符串的数字部分。

'http://www.example.com/value/1234/different-value'.match %r{(?<=/)\d+(?=/)}
#=> #<MatchData "1234">

$&
#=> "1234"

需要使用look-behind和look-ahead断言将表达式锚定到路径。没有它们,您也会匹配w3.example.com之类的内容。如果目标元素的位置可能会发生变化,并且您可以保证您感兴趣的元素是唯一与锚定正则表达式匹配的元素,则此解决方案是更好的方法。

如果有多个匹配项(例如http://www.example.com/1234/5678/),那么您可能希望使用String#scan来选择第一个或最后一个匹配项。这是其中一个&#34;了解您的数据&#34;事情;如果你有不规则的数据,那么正则表达式永远不是最好的选择。

答案 3 :(得分:0)

我认为这比接受的答案稍微简单一点,因为它不使用任何正向前瞻(?=),而只是通过?字符使最后一个斜杠可选:< / p>

^.+\/(.+)\/.+\/?$

在Ruby中:

STDIN.read.split("\n").each do |nextline|
   if nextline =~ /^.+\/(.+)\/.+\/?$/
    printf("matched %s in %s\n", $~[1], nextline);
   else
    puts "no match"
   end
end

Live Demo

让我们分解正在发生的事情:

  • ^:行的开头
  • .+\/:将任何东西(贪婪地)与斜线相匹配
    • 由于我们稍后将匹配至少1个,最多2个斜杠,此斜杠将是第二个斜杠(如http://www.example.com/value/1234/different-value)或第三个斜杠(如{{1} }})
    • 到目前为止,我们已匹配http://www.example.com/value/1234/different-value/(由于贪婪)
  • http://www.example.com/value/:我们的括号所示的(.+)\/捕获组。接下来是另一个斜线。
    • 由于上一个匹配与第二个或第三个斜杠相匹配,因此分别与最后一个斜杠或第二个斜杠相匹配
  • 1234:匹配任何内容。这将在我们.+之后,因此我们假设在12341234/)之后有字符
  • different-value:可选地匹配另一个斜杠(\/?之后的斜杠)
  • different-value:匹配行尾

请注意,在网址中,您可能没有空格。我使用了$字符,因为它很容易区分,但也许您可以使用.来匹配非空格。

此外,您可以使用\S代替\A来匹配字符串的开头(而不是换行符后)和^而不是\Z来匹配字符串的结尾(而不是换行)