Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用正则表达式查找多个内存大小?_Ruby_Regex - Fatal编程技术网

Ruby 使用正则表达式查找多个内存大小?

Ruby 使用正则表达式查找多个内存大小?,ruby,regex,Ruby,Regex,我有多种表示手机存储的字符串 一种字符串如下所示: 8 GB 8/16 GB 8/16/32 GB number/number/number/.../number GB 另一个是这样的: 8 GB 8/16 GB 8/16/32 GB number/number/number/.../number GB 还有一个是这样的: 8 GB 8/16 GB 8/16/32 GB number/number/number/.../number GB 一般来说,像这样: 8 GB

我有多种表示手机存储的字符串

一种字符串如下所示:

8 GB
8/16 GB
8/16/32 GB
number/number/number/.../number GB
另一个是这样的:

8 GB
8/16 GB
8/16/32 GB
number/number/number/.../number GB
还有一个是这样的:

8 GB
8/16 GB
8/16/32 GB
number/number/number/.../number GB
一般来说,像这样:

8 GB
8/16 GB
8/16/32 GB
number/number/number/.../number GB
而且

number GB
我希望能够得到不同类型的内存存储的可能性。为此:

8/16 GB
->我想得到[8,16]

8GB
->[8]

我不明白我如何做一个正则表达式来考虑这些情况。到目前为止,我知道如何做到这一点:

/(\d+)\s+GB/.match(my_storage_text)
但我不知道如何做考虑到有多个数字的情况下的一般方法

澄清:

让我说明我能找到哪种类型的字符串

8GB,1GB内存
-->我需要类似于
{:internal=>{:size=>[8],:units=>'GB'},:RAM=>{:size=>1,:units=>'GB'}的东西

8/16/32gb,128gbram
-->我需要像
{:internal=>{:size=>[8,16,32],:units=>'GB'},:RAM=>{:size=>128,:units=>'GB'}这样的东西

8/16/32 GB
-->我需要类似于
{:internal=>{:size=>[8,16,32],:units=>'GB'},:ram=>nil}
将“/”更改为“,”并在后面添加“[”和“]”


看起来您正在使用ruby来完成此任务。尝试:

# Match consecutive digits which are followed by a slash or a space
regexp = /(\d+)[\/ ]/

str1 = '8 GB'
str2 = '8/16 GB'
str3 = '8/16/32 GB'

str1.scan(regexp)    # => [["8"]]
str2.scan(regexp)    # => [["8"],["16"]]
str3.scan(regexp)    # => [["8"],["16"],["32"]]

# Since scan returns an array of single-element arrays,
# pare down the result to an array of strings .
str1.scan(regexp).map { |el| el[0] }   # => ["8"]
str2.scan(regexp).map { |el| el[0] }   # => ["8", "16"]
str3.scan(regexp).map { |el| el[0] }   # => ["8", "16", "32"]
根据OP的评论编辑

尝试:

结果输出:

8 GB RESULTS IN: {"size"=>[8], "unit"=>"GB"}
8/16 GB RESULTS IN: {"size"=>[8, 16], "unit"=>"GB"}
8/16/32 GB RESULTS IN: {"size"=>[8, 16, 32], "unit"=>"GB"}
256/512 MB RESULTS IN: {"size"=>[256, 512], "unit"=>"MB"}
试试这个

这将符合所有这些可能性

8/16/32 GB、8/16 GB和8 GB

/(\d+)\/?(\d+)?\/?(\d+)?\/?\sGB/

如果您有类似

subject = "8/16 GB; 512/1024 MB"
然后你可以用

/(\d+)(?=(?:\/\d+)*\s*([MG]B))/
要获取每个数字和相应单位的数组,请执行以下操作:

irb(main):002:0> subject.scan(/(\d+)(?=(?:\/\d+)*\s*([MG]B))/)
=> [["8", "GB"], ["16", "GB"], ["512", "MB"], ["1024", "MB"]]
说明:


这种方法的问题是,如果没有GB,只有MB,该怎么办?是的。“接得好,”霍默史密斯说。根据OP的帖子,我假设(也许是错误的)他只会看到GB。看来,至少在我们看到OP的进一步信息之前,他只关心数字而不关心单位(这可能是个问题)。我实际上是OP:)我应该说是的,单位可能会有所不同。哦,噢。我应该读得更仔细些。因此,如果字符串类似于
8/16/32 GB
,那么您可能希望捕获类似[{size:'8',unit:'GB'},{size:'16',unit:'GB'},{size:'32',unit:'GB'}]的内容。但是您的输入字符串如何查找像
256/512MB,1/2/4/8GB
?实际上,对于这个:1/2/4/8GB,我想得到{size:[1,2,4,8],单位:'GB}您知道吗?实际上,我应该更正确地说明我的问题。我已经用我能得到的字符串编辑了我的问题,但是你的回答将帮助我构建我想要的东西。