正则表达式在URL中的已知路径之后匹配路径

时间:2018-02-21 14:19:59

标签: regex perl

我试图让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"之后的斜线,可能存在也可能不存在。

3 个答案:

答案 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)

对于PCRE PHP,下面的代码对我来说很好。

/分支/(.+)//

live demo https://regex101.com/r/5m2uQe/1