查找字符串中的下一个字符

时间:2016-05-28 03:54:47

标签: ruby

这是一个字符串,

test = "IXIVDL"

如何找到#34; I"之后的哪个角色?在字符串? 而且它是否只是" X"或" V"还是其他什么?

例如。

"IDXCN"是无效字符串,因为"I" id后跟"D"

"IXD"是有效字符串,因为"I"后跟"X"

"IVIX"是有效字符串,因为"I"后跟"V""X"

"DIDIX"是无效字符串,因为"I"后跟"D"

"DXI"有效

我不想要任何字符串输出。结果应为true或false或nil。

4 个答案:

答案 0 :(得分:1)

def validate(str)    
  res = str.scan(/(?<=I).?/)
  puts "String is #{(res-['X','V']).empty? ? "valid" : "invalid"}"
  res.each do |c|
    if c.empty?
      puts "I at end of string is invalid"
    else
      puts "#{c} following I is #{c=~/[XV]/ ? "valid" : "invalid"}"
    end
  end
end

validate "IXIVDLIZRI"
String is invalid
X following I is valid
V following I is valid
Z following I is invalid
I at end of string is invalid

validate "IXIVDLIV"
String is valid
X following I is valid
V following I is valid
V following I is valid

/(?<=I)./匹配“I”后的任何字符。 (?<=I)是一个积极的看法。更改puts消息以适应。

答案 1 :(得分:1)

以下是一种可以运行以测试字符串的方法,如果没有Invalid String,则会输出I,或者I后面没有正确的字母指定。否则,它会输出Valid String, I is followed by...您选择的任何字母。在这种情况下XV

def find_I(test)
  index_of_I = test.split('').find_index { |letter| letter == 'I' }
  if index_of_I.nil? || test[index_of_I + 1].nil?
    return "Invalid String"
  elsif test[index_of_I + 1] =~ /[XV]/
    return "Valid String, I followed by #{test[index_of_I + 1]}"
  else
    return "Invalid String"
  end
end

答案 2 :(得分:0)

检查正则表达式的工作原理:Class: Regexp

这应该可以解决您的疑问,请注意有效子字符串的索引在存在时如何返回:

'IXIVDL' =~ /I[XV]/    # returns 0
'IDXCN'  =~ /I[XV]/    # returns nil
'IXD'    =~ /I[XV]/    # returns 0
'IVIX'   =~ /I[XV]/    # returns 2

如果您需要知道每个 I后面是X还是V,您可以改为:

'DID­IX' =~ /I[^X­V]/

返回有效字符串的nil(注意它在字符串末尾接受I。)

答案 3 :(得分:0)

这是最简单的解决方案。

def find_string_digits(str)
  str =~ /IX/ || str =~ /IV/ ? true : false
end

它正在使用正则表达式来匹配字符串中的某个模式,在这种情况下,“X”是否直接跟随“I”,或者“V”是否紧跟在“I”之后,如果是,则返回true,否则返回false。另外,如果你想检查说'I'之后的第3个字母是'X',你会匹配/I..X/,依此类推。

希望有所帮助。