1

我有一个字符串:

app_copy--28.ipa

我想要的结果是:

app_copy

after 的数字--可能是可变长度的,所以我想匹配包括 和 after 在内的所有内容--

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

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

我错过了什么?

4

3 回答 3

3

让我们看一下您的测试模式:

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

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

模式通常是Regexp; 如果作为 a 给出String,它包含的任何正则表达式元字符都将被逐字解释……

您需要包装类型将您的模式转换为Regexp(使用Regexp.new),或使用正则表达式文字

试试这个模式

--.*

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

例如:

"app_copy--28.ipa".gsub(/--.*/, "")     # app_copy
于 2013-09-10T19:06:00.323 回答
2

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

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

字符串[]接受许多不同类型的参数。您可以传入一个模式和您想要的捕获索引,以仅提取该部分。从文档中:

str[regexp, capture] → new_str or nil

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

于 2013-09-10T19:14:01.200 回答
1

这怎么样 ?

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

str = "app_copy--28.ipa"
str.split("--").first
# => "app_copy"
于 2013-09-10T19:05:36.260 回答