我试图在Ruby中调用我的字符串中的第一个重复字符。 我已经使用gets。
定义了一个输入字符串如何调用字符串中的第一个重复字符?
到目前为止,这是我的代码。
string = "#{gets}"
print string
如何从此字符串中调用字符?
编辑1:
这是我现在的代码,我的输出出现给我没有重复26次。我认为我的if语句写错了。
string "abcade"
puts string
for i in ('a'..'z')
if string =~ /(.)\1/
puts string.chars.group_by{|c| c}.find{|el| el[1].size >1}[0]
else
puts "no duplicates"
end
end
我的第二个put语句有效,但是对于for和if循环,无论字符串是什么,它都不会返回26次重复。
答案 0 :(得分:4)
如果我正确理解了这个问题,那么这是一个可能的答案:
the_string =~ /(.)\1/
返回第一个重复字母的索引。
示例:
'1234556' =~ /(.)\1/
=> 4
修改强>
要获得角色本身,只需使用$ 1:
$1
=> "5"
编辑2:
在if语句中:
if my_string =~ /(.)\1/
# do something with $1
else
# there is no match
end
答案 1 :(得分:4)
s.chars.map { |c| [c, s.count(c)] }.drop_while{|i| i[1] <= 1}.first[0]
使用Cary Swoveland的精炼表格:
s.each_char.find { |c| s.count(c) > 1 }
答案 2 :(得分:2)
下面的方法可能有助于查找字符串中的第一个单词
array4
答案 3 :(得分:1)
我相信这个问题可以用两种方式解释(既不涉及相同字符的第一个对),也为每个方法提供解决方案。
查找字符串中以相同字符开头的第一个字符
我不相信我们可以使用正则表达式(但希望被证明是错误的)。我会使用@DaveNewton评论中建议的方法:
require 'set'
def first_repeat_char(str)
str.each_char.with_object(Set.new) { |c,s| return c unless s.add?(c) }
nil
end
first_repeat_char("abcdebf") #=> b
first_repeat_char("abcdcbe") #=> c
first_repeat_char("abcdefg") #=> nil
查找多次出现的字符串中的第一个字符
r = /
(.) # match any character in capture group #1
.* # match any character zero of more times
? # do the preceding lazily
\K # forget everything matched so far
\1 # match the contents of capture group 1
/x
"abcdebf"[r] #=> b
"abccdeb"[r] #=> b
"abcdefg"[r] #=> nil
这个正则表达式很好,但产生警告,&#34;正则表达式有多余的嵌套重复运算符&#39; *&#39;&#34;。您可以忽略警告或通过做一些笨重的事情来抑制警告,例如:
r = /([^#{0.chr}]).*?\K\1/
其中([^#{0.chr}])
表示&#34;匹配捕获组1&#34;中除0.chr
以外的任何字符。
请注意,此处不能使用正面的lookbehind,因为它们不能包含可变长度匹配(即.*
)。
答案 4 :(得分:0)
我会使用String#[]
方法使用正向前瞻:
"abcccddde"[/(.)(?=\1)/] #=> c
答案 5 :(得分:0)
作为变体:
str = "abcdeff"
p str.chars.group_by{|c| c}.find{|el| el[1].size > 1}[0]
打印&#34; f&#34;
答案 6 :(得分:0)
你可以让你的string
数组并使用detect
。这应该返回计数为&gt;的第一个字符。 1。
string.split("").detect {|x| string.count(x) > 1}