【问题标题】:Negative lookbehind Regex in Numbers?数字中的负向正则表达式?
【发布时间】:2014-02-11 14:49:33
【问题描述】:

我正在尝试在图像扩展 (jpg|jpeg|png|bmp|gif|tif) 之前查找数字。 但如果有 NUMBERSxNUMBERS 模式,我想排除它们。 我的表达是:

(?!\dx\d)[0-9]{1,}.(jpg|jpeg|png|bmp|gif|tif)

●在这样的长链接中可以找到文本: http://www.google.com/imgres?newwindow=1&safe=off&sa=X&hl=es&rls=%7Bmoz%3AdistributionID%7D%3A%7Bmoz%3Alocale%7D%3A%7Bmoz%3Aofficial%7D&tbs=imgo%3A1&tbm=isch&tbnid=Sl6oOM1zv4WRkM%3A&imgrefurl=http%3A%2F%2Fes.gdefon.com%2Fdownload%2FMostrar-Pato-Duffy_El-show-del-Pato%2F30329%2F1280x1024&docid=JNlhLyS8MUlRAM&imgurl=http%3A%2F%2Fst.gdefon.com%2Fwallpapers_original%2Fwallpapers%2F30329_shou-daffi-daka_or_the-daffy-duck-show_1280x1024.jpg

试试这些: aoi32x453.jpg ser32xa453.jpeg as/as673.jpg x673.png ygt/x673.bmp x673.gif

我需要排除在我的表达式之前包含 '\dx\d' 的匹配项。

我需要匹配: sax73.jpg

但我不想要那些带有“NUMBERSxNUMBERS”的人: 35x35.jpg

  • ☻ Firefox Nightly 中 Greasemonkey 中的 Javascript
  • ☻ ser32xa453

【问题讨论】:

  • 您在哪个环境中使用这个(语言、编辑器、工具)?在不同的正则表达式实现中,对lookbehind 的支持程度不同。
  • 在您的示例中排除“x”并不是真正的问题。最大的问题是知道从哪里开始寻找 x。为此,您必须使用规则来解析整个文件名。
  • ser32xa453.jpeg 是错字还是应该匹配?
  • ☻ 我在 Greasemonkey for Firefox 中使用脚本 ☻ ser32xa453

标签: regex lookbehind


【解决方案1】:

(?!...) 是一个否定的预测预测。回头看是(?<!...)。此外,如果x 出现在您的模式之前的字符串中的任何位置,(?<!x.*) 将拒绝任何字符串。如果要确保x 不会出现在数字之前,请使用(?<!x)

但是,这只会匹配x 之后没有出现的第一个数字字符。例如在"35x73.jpg" 中,它只会匹配3.jpg。一个简单的解决方案是通过使用像 (?<![x0-9]) 这样的后视来确保前一个字符也不是数字。

更多注意事项:{1,} 可以简化为 +[0-9] 可以简化为 \d(尽管根据您的环境,\d 可能会匹配来自其他数字系统的数字,例如Eastern Arabic numerals):

(?<![x\d])\d+\.(jpg|jpeg|png|bmp|gif|tif)

【讨论】:

  • 我知道你会用 x 输入 \d。
  • 我所做的是添加 (\Dx)? ☻ (?
【解决方案2】:

如果您使用的语言没有后视功能(如 Javascript),或者因为您需要可变长度的后视功能(仅在 .net 语言 AFAIK 中受支持并且在 Java 中有一些限制),您可以使用捕获组:

(?:^|\s)[^x\s]*?([0-9]+\.(?:jpg|jpeg|png|bmp|gif|tif))(?:\s|$)

你只需要提取第一个捕获组

【讨论】:

    【解决方案3】:

    (?&lt;=\s)[^x]*?[0-9]+\.(jpg|jpeg|png|bmp|gif|tif)(?=\s)

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多