给定一个字符串,有哪些方法可用于检查某些字符的给定字符串的特定区域?例如,检查字符串的前三个字符是否有元音或辅音。
在发现这些特定字符后,有哪些方法可以将这些特定字符移动到字符串的不同部分?
我的猜测是将字符串变成数组,使用一种方法来选择数组的某个部分(不只是一个点 - 我想在数组中选择一个范围),然后检查所说的数组对几个字符的子类别。鉴于它们匹配其中一个字符类别,我想知道如何将范围字符移动到字符串的不同部分。
我知道这有点模糊,但这就是我需要的方式。我已经谷歌搜索了几个小时,我对术语不够熟悉,无法正确地谷歌我正在寻找的东西(或者甚至知道我读的是什么,我是什么&我#39;我正在寻找)。
(Ruby 2.3.3)
答案 0 :(得分:2)
方法1
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),同时将str
,from_off
和nbr
保持为上面指定的值。
(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