正则表达式修剪前导和尾随斜线并抓住其余部分

时间:2013-11-12 10:31:05

标签: regex url

我正在尝试捕获URL路径以产生没有前导和结尾斜杠/的部分。应匹配修剪前后的空输入字符。所需的正则表达式将表现如下:

input-string        captured-string
-----------------------------------
/a/b/c/             a/b/c               
/a/b/c              a/b/c               
/                   (empty)
(empty)             (empty)

我使用echo /a/b/c/d | sed -nr 's=(/(.+?)/)?=\2=p'及其风格作为gurus建议的测试工具,并注意到以下正则表达式无法完成工作:

regex           input-string    wrong capture
---------------------------------------------
(/(.+?)/)?      /a/b/c          a/bc
(/(.+?)/)       /a/b/c          a/bc
(/(.+?)/)       /a              (doesn't match)
(/(.+?)/?)      /a/b/c/         a/b/c/
(/([^/]+)/?)    /a/b/c          ab/c
(/([^/.+])/?)   /a/b/c          ab/c
/*(.*?)/*       /a/b/c/         a/b/c/

The alleged correct answer似乎无法正常工作:

echo /a/b/c | sed -nr 's=/*(?<x>.*?)/*=\k<x>=p'

因为它提供了此错误消息:

sed: -e expression #1, char 23: Invalid preceding regular expression

非常感谢帮助。

编辑:正如CompuChip所指出的,我使用了错误的测试工具sed,它似乎不支持非贪婪的修饰符。我使用的实际正则表达式引擎是boost::regex_match(),它给出了正确的结果,例如/?(.*?)/?。所以我想结束这个问题。

2 个答案:

答案 0 :(得分:1)

尝试关注sed

sed -r 's:^/|/$::'

简短说明

匹配:^/|/$ = ^//$,即前导和尾随斜杠

替换:(空)即修剪比赛

<强>测试

$ cat file
/a/b/c/
/a/b/c
/

$ sed -r 's:^/|/$::' file
a/b/c/
a/b/c

答案 1 :(得分:0)

如果只是这种条目(所以不在其他字符串内)

sed "s#$#/#;s#^[^/].*##;s#/*$##;s#^/##"

不要回避// bad / path /

这样的事情