文件名的正则表达式

时间:2014-10-06 09:00:30

标签: regex

如何制作一个RegEx,用于删除文件名中从最后一个下划线到.jpg扩展名的所有内容?

E.g。我有

aosta_8b08e16ae42367d29cbf11bcf27f376a.jpg
aosta_madreperla_014cb17607a4fb23fcb94a8f26efb267.jpg

并需要将其更改为此

aosta.jpg
aosta_madreperla.jpg

谢谢

6 个答案:

答案 0 :(得分:3)

删除匹配的或用空字符串替换

_[^_]*(?=\.)

Online demo

模式说明:

  _                        '_'

  [^_]*                    any character except: '_' (0 or more times)
  (?=                      look ahead to see if there is:
    \.                       '.'
  )                        end of look-ahead

阅读有关不使用字符串中字符的Lookahead and Lookbehind Zero-Length Assertions的更多信息,但只断言是否可以匹配。

答案 1 :(得分:0)

<强>正则表达式:

^(.*)_[^.]*

替换字符串:

$1

DEMO

<强>解释

  • ^(.*)_从最开始的_符号(不包括下划线)捕获所有字符并将其存储到组1中。
  • [^.]*匹配任何字符,但不匹配零点或多次。
  • 最后,所有匹配的字符都被组索引1中的字符替换。

答案 2 :(得分:0)

您可以使用此正则表达式执行此操作

/[^_]+.jpg$/

并替换为.jpg

答案 3 :(得分:0)

试试这个 -

Search - ^(\w+)\_[^.]+(.*)$
Replace- \1\2

DEMO

答案 4 :(得分:0)

_(?!.*?_).*?(?=\.)

试试这个。通过``。查看演示。

http://regex101.com/r/hQ1rP0/18

_匹配字符_字面

(?!.*?_)否定前瞻 - 断言无法匹配包含_的字符串。

(?=\.)肯定前瞻 - 断言字符串在其前面有.时结束。

答案 5 :(得分:0)

您不需要使用正则表达式,仅使用substrstrpos,它应该更快。

$str = array(
    'aosta_8b08e16ae42367d29cbf11bcf27f376a.jpg',       
    'aosta_madreperla_014cb17607a4fb23fcb94a8f26efb267.jpg'
);

foreach ($str as $s) {
    echo substr($s, 0, strrpos($s, '_')) . substr($s, -4);
    echo '<br>';
}