(Perl/PCRE语法)
/^([^._]+)/
这将捕捉字符串中最长的前缀, 它不包含时段或下划线 。
EDIT :OK,如果 shirk
是 shirit1
中的前缀,那么您可以尝试这样的方式:
/^([^._]+)(?<!d)/
不允许以位数表示结尾的前缀。 在Ruby 1. 8 中这行不通, 因为 1.8 中没有类似的说法 。
EDIT 2:
The above means that the prefix of top1_01
is top
, but we want that one to include the digits before the underscore. So our last attempt is to add an alternative:
/^([^._]+)(?:(?<!d)|(?=_))/
The prefix has to either not end in a digit or be followed by an underscore.
Demo:
%w<gloves.tga 10jeans.jpg shirt1.png shirt2.png
coat_00.png coat_12.gif top1_01.png top2_04.png>.each do |filename|
if m = filename.match(/^([^._]+)(?:(?<!d)|(?=_))/) then
puts [ filename, m[1] ].join ": "
else
warn "Uh-oh, couldn t find a prefix in filename #{filename} ."
end
end
产出:
gloves.tga: gloves
10jeans.jpg: 10jeans
shirt1.png: shirt
shirt2.png: shirt
coat_00.png: coat
coat_12.gif: coat
top1_01.png: top1
top2_04.png: top2