我有一个字符串:
app_copy--28.ipa
我想要的结果是:
app_copy
--
之后的数字可能是可变长度的,所以我希望匹配--
之后的所有内容。
我尝试了一些模式,但由于某种原因没有匹配:
gsub("--\*", "")
gsub("--*", "")
gsub("--*.ipa", "")
gsub("--\[0-9].ipa", "")
我错过了什么?
答案 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"