1

我正在尝试捕获 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' 的建议使用及其风格作为测试工具,并注意到以下正则表达式无法完成这项工作:

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/

所谓的正确答案似乎也不起作用:

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()给我正确的结果给定正则表达式,例如/?(.*?)/?. 所以我想结束这个问题。

4

2 回答 2

1

尝试关注sed

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

简短的介绍

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

替换:(空)即修剪匹配

测试

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

$ sed -r 's:^/|/$::' file
a/b/c/
a/b/c
于 2013-11-12T10:40:32.653 回答
0

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

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

不要避免像 //bad/path/ 这样的事情

于 2013-11-12T13:06:07.147 回答