查找字符串Ruby

时间:2015-06-03 15:38:57

标签: ruby

我试图在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次重复。

7 个答案:

答案 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}