我有一个像这样的字符串:
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/
我有一个像这样的字符串:
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/
/([^/]+)(?=/[^/]+/?$)
应该是有效的。您可能需要根据您使用的语言进行不同的格式化。例如,在Ruby中,它是
if subject =~ /\/([^\/]+)(?=\/[^\/]+\/?\Z)/
match = $~[1]
else
match = ""
end
/([^/]+)/[^/]+/?$
。 - Qtax如果您总是想从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"
http://www.example.com/1234/
,则会得到nil。
'http://www.example.com/value/1234/different-value'.match %r{(?<=/)\d+(?=/)}
#=> #<MatchData "1234">
$&
#=> "1234"
使用前后断言是为了将表达式锚定到路径上。如果没有它们,你会匹配到像w3.example.com
这样的东西。如果目标元素的位置可能会改变,并且你可以保证你感兴趣的元素是唯一与锚定的正则表达式匹配的元素,那么这个解决方案是一个更好的方法。
如果有多个匹配项(例如http://www.example.com/1234/5678/
),那么你可能想使用String#scan来选择第一个或最后一个匹配项。这是其中一些“了解你的数据”的事情;如果你的数据不规则,那么正则表达式并不总是最好的选择。
Javascript:
var myregexp = /:\/\/.*?\/.*?\/(\d+)/;
var match = myregexp.exec(subject);
if (match != null) {
result = match[1];
}
适用于您的示例...但我确信它在一般情况下会失败...
Ruby编辑:
if subject =~ /:\/\/.*?\/.*?\/(.+?)\//
match = $~[1]
它确实有效。
?=
),而只是通过?
字符使最后一个斜杠可选:^.+\/(.+)\/.+\/?$
STDIN.read.split("\n").each do |nextline|
if nextline =~ /^.+\/(.+)\/.+\/?$/
printf("matched %s in %s\n", $~[1], nextline);
else
puts "no match"
end
end
^
: 行的开头.+\/
: 匹配斜杠之前的任何内容(贪婪匹配)
http://www.example.com/value/1234/different-value
)或倒数第三个斜杠(如http://www.example.com/value/1234/different-value/
)http://www.example.com/value/
(由于贪婪性)(.+)\/
: 我们捕获的组1234
由括号指示。它是紧随另一个斜杠后的任何内容。
.+
: 匹配任何内容。这将在我们的1234 /
之后,因此我们假设在1234 /
之后有字符(different-value
)\/?
: 可选地匹配另一个斜杠(different-value
之后的斜杠)$
: 匹配行的结尾 .
字符是因为它很容易区分,但也许您可以使用 \S
来匹配非空格。 \A
代替 ^
来匹配字符串的开头(而不是换行符后面),并使用 \Z
代替 $
来匹配字符串的结尾(而不是在换行符处)。