检查任何字符串的某个部分是否有某些字符,然后将这些特定字符移动到字符串的不同部分(Ruby 2.3.3)

时间:2017-07-28 20:02:01

标签: arrays ruby string

给定一个字符串,有哪些方法可用于检查某些字符的给定字符串的特定区域?例如,检查字符串的前三个字符是否有元音或辅音。

在发现这些特定字符后,有哪些方法可以将这些特定字符移动到字符串的不同部分?

我的猜测是将字符串变成数组,使用一种方法来选择数组的某个部分(不只是一个点 - 我想在数组中选择一个范围),然后检查所说的数组对几个字符的子类别。鉴于它们匹配其中一个字符类别,我想知道如何将范围字符移动到字符串的不同部分。

我知道这有点模糊,但这就是我需要的方式。我已经谷歌搜索了几个小时,我对术语不够熟悉,无法正确地谷歌我正在寻找的东西(或者甚至知道我读的是什么,我是什么&我#39;我正在寻找)。

(Ruby 2.3.3)

2 个答案:

答案 0 :(得分:2)

方法1

您可以使用partitioninsert

s = "aaabbbb"

range = 0..2
a, b = s.chars.partition.with_index { |_, i| range.include? i }
b.insert(2, *a).join #=> "bbaaabb"

此方法引用假分区b进行插入。如果您更愿意引用原始字符串,请执行以下操作。

方法2

def paste(str, range, ins)
  ar = str.chars.map.with_index { |c, i| range.include?(i) ? nil : c }
  a = str[range]
  ar.insert(ins, *a).join
end

p paste 'aaabbbb', 0...3, -1 #=> "bbbbaaa"
p paste 'aaabbbb', 3...7, 0  #=> "bbbbaaa"
p paste 'aaabbbb', 2...3, 7  #=> "aabbbba"

接近1的步骤

选择范围,即您要剪切的字符。

range = 0..2

转换为字符数组

p s.chars
 #=> ["a", "a", "a", "b", "b", "b", "b"]

使用并行分配对要保留的字母a和不b的字母进行分区。

s.chars.partition.with_index { |_, i| range.include? i }
 #=> [["a", "a", "a"], ["b", "b", "b", "b"]]

#parallel assignment
a, b = [["a", "a", "a"], ["b", "b", "b", "b"]]
p a #=> ["a", "a", "a"]
p b #=> ["b", "b", "b", "b"]

保持a不变,或将其重新映射到其他内容,例如a = a.map(&:upcase) #=> ["A", "A", "A"]。然后将a插入指定索引的b,然后重新连接所有内容。

p b.insert(2, *a).join
 #=> "bbaaabb"

备注

我们使用p来检查和打印各种返回值。如果你是Ruby的新手,那么这里有很多东西,所以不要期望立刻得到所有东西 - 仔细按照步骤阅读documentaion方法2 的步骤被省略,但是如果你可以按照方法1 ,那么方法2 将没有问题。

答案 1 :(得分:0)

我会这样做。

def movem(str, from_off, nbr, to_off)
  to_off -= [to_off-from_off, nbr].min if to_off > from_off
  (str[0, from_off] + str[from_off+nbr..-1]).insert(to_off, str[from_off,nbr])
end

str = "whaXXtchamacallit"
#      01234567890123456
from_off = 3
num = 2

下面我将to_off从零变为str.size(17),同时将strfrom_offnbr保持为上面指定的值。

(0..str.size).each { |i| puts "%2d: %s" % [i, movem(str, from_off, num, i)] }
 0: XXwhatchamacallit
 1: wXXhatchamacallit
 2: whXXatchamacallit
 3: whaXXtchamacallit
 4: whaXXtchamacallit
 5: whaXXtchamacallit
 6: whatXXchamacallit
 7: whatcXXhamacallit
 8: whatchXXamacallit
 9: whatchaXXmacallit
10: whatchamXXacallit
11: whatchamaXXcallit
12: whatchamacXXallit
13: whatchamacaXXllit
14: whatchamacalXXlit
15: whatchamacallXXit
16: whatchamacalliXXt
17: whatchamacallitXX