为什么我的简单正则表达式模式不匹配并删除文件扩展名?

时间:2013-09-10 19:03:41

标签: ruby regex

我有一个字符串:

app_copy--28.ipa

我想要的结果是:

app_copy

--之后的数字可能是可变长度的,所以我希望匹配--之后的所有内容。

我尝试了一些模式,但由于某种原因没有匹配:

gsub("--\*", "")
gsub("--*", "")
gsub("--*.ipa", "")
gsub("--\[0-9].ipa", "")

我错过了什么?

3 个答案:

答案 0 :(得分:3)

让我们来看看你的测试模式:

  • "--\*"实际上等同于"--*"(因为\*是转义序列)。
  • "--*"将匹配单个-字符,后跟零个或多个-个字符。
  • "--*.ipa"将匹配单个-字符,后跟零个或多个-个字符,后跟任意单个字符,后跟文字ipa
  • "--\[0-9].ipa"实际上等同于"--[0-9].ipa"(因为\[是转义序列),它将匹配文字--,后跟一个十进制数字,然后任何单个字符,后跟文字ipa

但是,这些模式都不会像您使用它们那样起作用,因为gsub不会将其视为正则表达式:

  

模式通常为Regexp;如果作为String给出,它包含的任何正则表达式元字符将按字面解释......

您需要将类型转换为Regexp(使用Regexp.new),或使用regular expression literal

尝试这种模式

--.*

此模式将找到任何文字--,后跟零个或多个任何字符。

例如:

"app_copy--28.ipa".gsub(/--.*/, "")     # app_copy

答案 1 :(得分:2)

不要使用gsub尝试更改字符串,只需使用模式匹配您想要的部分:

"app_copy--28.ipa"[/^(.+?)--/, 1] # => "app_copy"

String []需要很多不同类型的参数。您可以传入模式和所需捕获的索引,以仅提取该部分。来自文档:

str[regexp, capture] → new_str or nil
  

如果提供了Regexp,则返回字符串的匹配部分。如果捕获遵循正则表达式(可能是捕获组索引或名称),则遵循正则表达式,而不是返回MatchData的组件。

答案 2 :(得分:1)

这是怎么回事?

str = "app_copy--28.ipa"
str[0..str.index("-")-1]
# => "app_copy"

str = "app_copy--28.ipa"
str.split("--").first
# => "app_copy"