从字符串中捕获内容

时间:2014-01-25 09:23:33

标签: regex

我正在尝试解析一些日志以获取所查看项目的特定目录号。我已经打破了所有必要的字段,现在正在解析referer字段以获取所查看页面的目录ID。

字符串采用以下格式:

   /catalog/AAA1111111
   /catalog/BBB-22222-1/
   /catalog/CCC-333333/XXX
   http://url/catalog/DDD-44444444
   http://url/catalog/EEE-555555555/ZZZ

我正在使用以下正则表达式删除目录ID:

   .*\/catalog\/([^\/]+)

问题是我无法阻止正则表达式在下一个正斜杠后抓住所有内容。看起来好像是贪心?

结果是:

   AAA1111111
   BBB-22222-1/
   CCC-333333/XXX
   DDD-44444444
   http:EEE-555555555/ZZZ

我一直在敲打这个问题几个小时。

我只是在寻找一个正则表达式,它只会拆分目录ID(目录/后面的字符串)。

任何人都可以帮助引导这位老编码员朝着正确的方向前进吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

使用sed

cat catalogs  | sed -E 's/.*\/catalog\/([^/]+)\/?.*/\1/g'

结果

AAA1111111
BBB-22222-1
CCC-333333
DDD-44444444
EEE-555555555

请注意,唯一的修改是匹配尾随的内容

答案 1 :(得分:0)

为什么在分割“/ catalog /”时使用正则表达式,取最后一项然后拆分为“/”并取第一项?

在Python中,可以这样做:

line.split('/catalog/')[-1].split('/')[0]

只是想指出regexp不是每个字符串解析问题的解决方案。 通常,当您面对“贪婪”解析时,在使用正则表达式之前进行“手动”修改有帮助