我试图让perl正则表达式给我一个URL中某个路径后出现的路径:
要测试的网址:
http://example.org/project/branches/new-feature
http://example.org/project/branches/new-feature/src
鉴于以上任一URL,我想捕获" new-feature"。使用下面的Perl正则表达式,我可以使用第二个URL而不是第一个。
echo $url | perl -pe 's|^.*/branches/(.*?)/.*$|\1|'
问题在于" new-feature"之后的斜线,可能存在也可能不存在。
答案 0 :(得分:1)
您可以选择/.*
。使用
perl -pe 's|^.*/branches/([^/]*)(?:/.*)?$|$1|'
或者
sed 's|^.*/branches/\([^/]*\)\(/.*\)\?$|\1|'
或者,如果你能负担得起GNU grep
:
grep -oP '/branches/\K[^/]+'
(?:/.*)?
部分匹配/
的1或0次出现,后跟除换行符之外的任何0+字符。 sed
解决方案是相同的,只是元字符被转义,因为它是符合BRE POSIX的模式。在grep
解决方案中,/branches/\K
匹配/branches/
,之后将丢弃该值,并且返回的唯一文本是与[^/]+
匹配的文本(除{以外的一个或多个字符) {1}})。
查看online demo。
答案 1 :(得分:1)
试试这个:
perl -pe 's|.*?/branches/([^/]+).*|$1|'
请注意
$1
不像sed-like \1
[^\/]+
表示:除/
以外的所有字符,+
表示至少发生一次另一种解决方案:
perl -lne 'print $& if m|/branches/\K[^/]+|'
答案 2 :(得分:-2)