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