我有一个字符串:
app_copy--28.ipa
我想要的结果是:
app_copy
after 的数字--
可能是可变长度的,所以我想匹配包括 和 after 在内的所有内容--
。
我尝试了一些模式,但由于某种原因没有一个匹配:
gsub("--\*", "")
gsub("--*", "")
gsub("--*.ipa", "")
gsub("--\[0-9].ipa", "")
我错过了什么?
让我们看一下您的测试模式:
"--\*"
实际上等价于"--*"
(因为\*
是转义序列)。"--*"
将匹配单个-
字符,后跟零个或多个-
字符。"--*.ipa"
将匹配单个-
字符,然后是零个或多个-
字符,然后是任何单个字符,然后是文字ipa
。"--\[0-9].ipa"
实际上等价于"--[0-9].ipa"
(因为\[
是一个转义序列),它将匹配一个字面量--
,后跟一个十进制数字,然后是任何单个字符,然后是一个字面量ipa
。但是,这些模式都不会在您使用它们时起作用,因为它们gsub
不会将其视为正则表达式:
模式通常是
Regexp
; 如果作为 a 给出String
,它包含的任何正则表达式元字符都将被逐字解释……
您需要包装类型将您的模式转换为Regexp
(使用Regexp.new
),或使用正则表达式文字。
试试这个模式
--.*
此模式将找到任何文字--
,后跟零个或多个任何字符。
例如:
"app_copy--28.ipa".gsub(/--.*/, "") # app_copy
不要gsub
用来尝试更改字符串,只需使用模式来匹配您想要的部分:
"app_copy--28.ipa"[/^(.+?)--/, 1] # => "app_copy"
字符串[]
接受许多不同类型的参数。您可以传入一个模式和您想要的捕获索引,以仅提取该部分。从文档中:
str[regexp, capture] → new_str or nil
如果提供了 Regexp,则返回字符串的匹配部分。如果捕获遵循正则表达式(可能是捕获组索引或名称),则遵循返回 MatchData 组件的正则表达式。
这怎么样 ?
str = "app_copy--28.ipa"
str[0..str.index("-")-1]
# => "app_copy"
str = "app_copy--28.ipa"
str.split("--").first
# => "app_copy"