【问题标题】:Matching URL of specific pattern特定模式的匹配 URL
【发布时间】:2011-08-31 23:03:59
【问题描述】:

我正在尝试匹配这样的 URL:

something_with_underscore.png
something_with_underscore_mark.png
something_with_underscore_3600.png
something_with_underscore_10x10.png
something_with_underscore_10x10_mark.png
something_with_underscore_10x10_3600_mark.png

使用这个正则表达式:

(.+(?!(?:_[0-9]+x[0-9]+)?(?:_[0-9]+)?(?:_mark)?\.(?:jpg|png|gif)))((?:_([0-9]+)x([0-9]+))?(?:_([0-9]+))?(_mark)?)\.(jpg|png|gif)

这基本上是两部分,第一部分捕获名称:

(.+(?!(?:_[0-9]+x[0-9]+)?(?:_[0-9]+)?(?:_mark)?\.(?:jpg|png|gif)))

第二部分捕捉“特征”:

((?:_([0-9]+)x([0-9]+))?(?:_([0-9]+))?(_mark)?)\.(jpg|png|gif)

我有兴趣捕捉:

group 1: something_with_underscore
group 2: (everything after group 1)
group 3: (first integer 10 of 10x10 part)
group 4: (second integer 10 of 10x10 part)
group 5: (the integer 3600 or whatever it is - if is there)
group 6: _mark (if is there)
group 7: (png, jpg, gif)

我正在使用带有类似于匹配组的模式的负前瞻来获取文件名。我这样做是为了允许 _ 在 url 的名称部分。然而,这失败了。 (如果您能看到实现此目的的另一种方法,请告知)。

我认为这与 _ 和 .但我似乎无法弄清楚如何。

例如,如果您从表达式中删除第一个 _,则最后三个测试用例将正确匹配。

【问题讨论】:

  • 需要创建七个组吗?
  • @Doug,重要的是我匹配了 URL,以便我可以提取信息(一些女巫是可选的)。我不知道你为什么要问这七组——你能用不同的方式问吗?
  • 我想知道您是否正在尝试进行正则表达式查找和替换。如果您尝试使用正则表达式进行替换,那么我的回答是不够的。
  • 我正在尝试从 URL/文件名中提取一组可选信息。

标签: regex


【解决方案1】:

怎么样:

(.+?)(_?([0-9]+)?x?([0-9]+)?_?([0-9]+)?(_mark)?\.(jpg|png|gif))

【讨论】:

  • 酷,对分组进行一些修改,这很有效。你能解释一下为什么开头(.+?) 的惰性匹配会匹配所有something_with_underscore 而不仅仅是s
  • 有了这个修改(.+?)(_?(?:([0-9]+)x([0-9]+))?_?([0-9]+)?(_mark)?)\.(jpg|png|gif),它将匹配我问题中的组。
  • @Michael:它将匹配,直到找到下划线后跟数字或文字标记,如果没有匹配,则转到扩展名。
  • 感谢您的解释。毕竟没那么懒。呵呵
【解决方案2】:

这就是你要找的吗?它匹配你所有的例子。

([^\.]+)(([0-9]+x[0-9]+)?)((_3600)?)((_mark)?)(\.(jpg|png|gif))

【讨论】:

  • 不,因为如果您查看匹配的组,除了扩展名之外的所有组都进入第一组([^\.]+)。您可以将所有内容移动到最后并实现相同的目标。
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
相关资源
最近更新 更多