正则表达式:匹配最后一次出现的“/”和行尾之间的模式

时间:2011-04-14 11:07:25

标签: regex grep

我无法弄清楚如何匹配LAST /和行尾之间的模式。

我有很多:
的/ usr /等/布拉布拉:在/ etc / BBB
的/ usr /等/布拉布拉:在/ etc / bffb.gh
的/ usr /等/布拉布拉:/本地/ fffusr
的/ usr /等/布拉布拉:/ bin中/ dfusrd
的/ usr /等/ var:所有的/ etc / aaaaaf.ju

例如,我只想在“粗体”部分匹配“usr” 我正在使用grep。

编辑:
我对这个解决方案有一个小问题:
/([^ /] +)$
如果它紧跟在/之后,它与模式不匹配,例如那些:
在/ usr的/ etc /布拉布拉:/斌/ usrlala
/斌/ BLA /:在/ etc / USR
不匹配

找到它:/([^ /] *)$

5 个答案:

答案 0 :(得分:2)

这将是:

/([^/]+)$

但也许你必须逃避斜线(/),具体取决于你的语言:

/\/([^\/]+)$/

答案 1 :(得分:1)

为什么要在这么简单的任务中使用正则表达式?

如果您使用的是php,可以使用

$pos = strrpos($line, '/'); 

确定/的最后一次出现然后从那里复制所有内容

$name = substr($line, $pos+1);

正则表达式不是最终的解决方案。在这种简单的字符串操作上会更慢。好吧,你自己解析一个字符串的过程总是会慢一些(如果写好的话)。

答案 2 :(得分:1)

echo "
/usr/etc/blabla:/etc/bbb
/usr/etc/blabla:/etc/bffb.gh
/usr/etc/blabla:/local/fffusr
/usr/etc/blabla:/bin/dfusrd
/usr/etc/var:/etc/aaaaaf.ju" | sed -n 's#.*/##;/.*usr.*/p'
fffusr
dfusrd

答案 3 :(得分:0)

在javascript中回答

var s = "/usr/etc/var:/etc/aaaaaf.ju"
s ; //# => /usr/etc/var:/etc/aaaaaf.ju
var last = s.match(/[^/]+$/);
last ; //# => aaaaaf.ju

答案 4 :(得分:0)

使用PCRE:

$re = '/.+\/.*usr.*/i';

$string = '/usr/etc/blabla:/etc/bbb
/usr/etc/blabla:/etc/bffb.gh
/usr/etc/blabla:/local/fffusr
/usr/etc/blabla:/bin/dfusrd
/usr/etc/var:/etc/aaaaaf.ju';

$nMatches = preg_match_all($re, $string, $aMatches);

<强>结果:

Array
(
    [0] => Array
        (
            [0] => /usr/etc/blabla:/local/fffusr
            [1] => /usr/etc/blabla:/bin/dfusrd
        )

)