Arrays Ruby:严格使用数组表示法从字符串数组的每个元素中获取字符[n]

Arrays Ruby:严格使用数组表示法从字符串数组的每个元素中获取字符[n],arrays,ruby,substring,Arrays,Ruby,Substring,假设我有这个: x = %w(greater yellow bandicooot) 我想得到每个字符串的一个特定字母作为一个字符串。当然,我可以这样做(得到第一个字母): 但我想知道是否有一种方法可以使用数组表示法。我试过这个: x[0][0]..x[-1][0] 在本例中,它返回的是不太有用的“g”。“b”。在这种情况下,我也可以使用如下数组表示法: x[0][0] + x[1][0] + x[2][0] 但我正在寻找一个不需要迭代的非特定案例的解决方案 有没有一种方法可以严格使用数组表

假设我有这个:

x = %w(greater yellow bandicooot)
我想得到每个字符串的一个特定字母作为一个字符串。当然,我可以这样做(得到第一个字母):

但我想知道是否有一种方法可以使用数组表示法。我试过这个:

x[0][0]..x[-1][0]
在本例中,它返回的是不太有用的
“g”。“b”
。在这种情况下,我也可以使用如下数组表示法:

x[0][0] + x[1][0] + x[2][0]
但我正在寻找一个不需要迭代的非特定案例的解决方案


有没有一种方法可以严格使用数组表示法,或者有必要进行某种迭代?如果不能使用数组表示法,有没有比使用
map
join
更好的方法呢?

如果将单词组合在一个空格分隔的字符串中,这里有一种奇特的正则表达式方法:

string = "greater yellow bandicooot"
string.gsub /([^ ])[^ ]* */, '\1'
# => "gyb"
正则表达式的解释:

  • ([^])
    :匹配组-单个非空格字符
  • [^]**
    :可选的非空格字符序列,后跟任意可选的空格字符序列
正如您在这里看到的:,当使用
gsub
时,整个正则表达式中的所有内容都将被替换,而不管它是否在匹配组中。因此,您需要在
gsub
调用中使用特殊变量
\1
(顺便说一下,必须在单引号字符串中)来引用要用作输出的第一个匹配组

如果不能使用数组表示法,有没有比使用map和join更好的方法呢

简单的回答是“这是不可能的”——要得到数组中每个字符串的第n个字符,显然必须迭代(是的,regexp也是迭代的——性能可能不如数组迭代)

但让我们想象一下,您有一个真正的应用程序,您应该经常执行此操作,并且字符串列表非常庞大(因此迭代非常痛苦)。另一方面,字符串列表很少更改,您几乎不需要返回原始字符串

在本例中,您可以借用列存储背后的思想,将原始阵列转换为

transposed_x=[“gyb”,“rea”,“eln”,“ald”,“toi”,“ewc”,“r_o”,“r_o”,“r_o”,“r_o”,“r_t”]


其中,每个第n个元素只是每个原始字符串的第n个字符的串联(为了清晰起见,这里我将“缺少”字符替换为u)。使用此数据模型,您可以执行原始任务1)仅使用数组表示法,2)使用O(1)。作为一个明显的折衷,您将不得不为每一个其他操作(取回原始字符串、添加/删除/更新等)进行迭代。

我不相信有什么方法可以实现您想要的,但您可以执行以下操作

str = %w(greater yellow bandicooot).join(' ')
  #=> "greater yellow bandicooot"

str.gsub(/(?<=\S)./, '')
  #=> "gyb"
str=%w(更大的黄色条纹)。加入(“”)
#=>“更大的黄色条纹”
str.gsub(/(?“gyb”
正则表达式匹配前面有非空白字符的任何字符;也就是说,它匹配除字符串的第一个字符和前面有空白字符的字符以外的所有字符

如果给一个字符串,单词之间可能有多个空格,则可以写:

str.squeeze(' ').gsub(/(?<=\S)./, '')

str.squence(“”).gsub(/(?我想你可以使用正则表达式,但我不知道这是否真的是一种更好的方法。@maxpleaner是的,我也考虑过,但我看不到一种使用正则表达式而不需要迭代数组的方法。是吗?非常有趣。我一直都在使用正则表达式,我知道你可以在带有
g的块中使用
\1
。)sub
,但我不知道你可以这样使用它。非常酷。我会研究一下,看看是否可以调整它,以在每个单词中获得任何特定的连续字符位置集,这也是我最终要寻找的。在你想到在字符串上使用正则表达式后,我想到了这个:
string.split.scan(/^\w)|(?很酷,我不太擅长正则表达式,从来没有学习过lookaheads,我只是刚刚开始学习。据我所知,这实际上是一个lookback。因此,据我所知,捕获字符串后的
\w
(?是的,rubular很好。顺便说一句,你可以自由地接受你自己的答案,因此它不会出现未解决的问题。非常有趣。对于大型数据集,我会记住它。感谢分享。有趣。现在,如果你使用小写
\s
,它会匹配前面有空格的两个字符,但不会匹配第一个字符。那么为什么不匹配呢她的
\s
\s
与第一个字符匹配?人们可能会想,它前面是否有空白字符。从正则表达式的角度来看,字符串中的第一个字符是否有一些特殊的特征?假设我将正向查找写为
(?哦,我明白了!您正在匹配任何类型的前面有字母字符的所有字符。因此,前面有空格或完全没有空格的字符将不匹配。太好了。感谢您的解释。
str.squeeze(' ').gsub(/(?<=\S)./, '')