如何在“。”之前找到空格。
我有名字“example .png”和“example 2.png”。我试图将任何空间转换为“_”和“”之前的任何空格。应该被删除。如何在“。”之前找到空格。
到目前为止,我这样做是这样的:
file.gsub(" .",".").gsub(" ", "_").gsub(".tif", "")
使用的rstrip
PED File.basename(filename,File.extname(filename))
和替换空格用下划线里面再增加一个extname
:
File.basename(filename,File.extname(filename)).rstrip.gsub(" ", "_") + File.extname(filename)
详情:
-
File.basename(filename,File.extname(filename))
- 获取文件名不带扩展 -
.rstrip
- 扩展 -
.gsub(" ", "_")
之前删除空格 - 取代空间(使用/\s+/
正则表达式,以消除任何空格)用下划线 -
File.extname(filename)
- 文件扩展名。
如果你喜欢一个正则表达式的方法:
s = 'some example 2 .png'
puts s.gsub(/\s+(\.[^.]+\z)|\s/) {
Regexp.last_match(1) ?
Regexp.last_match(1) :
"_"
}
(can be shortened到s.gsub(/\s+(\.[^.]+\z)|\s/) { $1 || "_" }
(见Jordan's remark))。 见this Ruby demo。
在此,模式匹配:
-
\s+(\.[^.]+\z)
- 1以上空格(\s+
)扩展之前(\.[^.]+
- 一个点,随后以比串\z
结束之前的点其他1+字符),而捕捉拓成1组 -
|
- 或 -
\s
- 任何其他的空格符号(后添加+
如果你需要用下划线替换整个空格块)。
在gsub
块中,执行检查以测试组1,如果匹配,则只有扩展插入到结果中。否则,用空格替换下划线。
更简洁:'s.gsub(/.../){$ 1 || “_”}'。 –
@Jordan:是的,逻辑保持不变:组1或 - 如果它不匹配 - 使用'_'替换。 –
是的......这就是为什么我发布了评论的原因。 –
请记住'.'是正则表达式中的特殊字符。 – tadman