正则表达式施工协助

时间:2014-03-19 10:02:17

标签: regex

我已经陷入了构建正则表达式的困境,并且想知道你们是否可以帮助我。

这里是完整的字符串:

/20271/Avtal%202013/Sammanst%c3%a4lld_produktlista_2013_v121220_l%c3%a5st_web.xls

我想提取 2013_v121220 ,但匹配必须遵循以下几条规则:

  • 版本字符串的总长度必须至少为4个字符
  • 必须允许不包含" v"的版本字符串。或" _",即 2013121220 2013_121220
  • 版本字符串必须是字符串结尾之前的最后一次出现(即在这种情况下不匹配/ 20271 /。)

我已尝试使用(\d+[_v]*\d+).*?_web(\.xlsx?)$,但我不知道如何在此处实施长度检查,即(\d+[_v]*\d+)必须至少包含4个字符,{4,},这是与_l%c3%a5st_web.xls中的 5 不匹配。


我已经提出了这个正则表达式:(\d[\d_v]{2,}\d).*?_web(\.xlsx?)$但它只匹配第一次出现,我需要最后一个,最接近结束。我已尝试将.+添加到正则表达式前缀,但无论如何都会失败。

3 个答案:

答案 0 :(得分:0)

(?<=produktlista_)(\d{1,}(?:_v)\d{1,}|\d{4,})

这将为您提供productlista的价值

编辑anubhavas正则表达式

\d{1,}(?:_v)?\d{1,}(?=.*?_web\.xlsx?$)

演示:http://regex101.com/r/pW6mV8

答案 1 :(得分:0)

您可以使用此正则表达式:

(?=\d*\d.{2}\d\d*\D)\d+(?:_v)?\d+(?!.*?\d(?:_v)?\d)(?=.*?_web\.xlsx?$)

Working Demo

答案 2 :(得分:0)

我自己设法解决了这个问题。谢谢你的努力,我真的很感激你的 帮助

这个正则表达式完全符合我的规则:

(\d[\d_v]{2,}\d)(?!.*\d[\d_v]{2,}\d).*?_web(\.xlsx?)$