如何获得Ruby的特殊字符(如:)前面的句子?

如何获得Ruby的特殊字符(如:)前面的句子?,ruby,regex,Ruby,Regex,我需要从完整的句子中得到“:”字符之前的句子 我有“这条信息会自毁:Ruby很有趣” 我只需要“这条消息会自毁” 这是我的方法 def destroy_message(sentence) check_list = /[^:]/ sentence_list = /^([a-zA-z\s]+) \:/ if sentence =~ check_list puts "have :" firstConsonant = sentence.match

我需要从完整的句子中得到“:”字符之前的句子

我有“这条信息会自毁:Ruby很有趣”

我只需要“这条消息会自毁”

这是我的方法

def destroy_message(sentence)
    check_list = /[^:]/
    sentence_list = /^([a-zA-z\s]+) \:/

    if sentence =~ check_list
        puts "have :"
        firstConsonant = sentence.match(sentence_list)
        puts firstConsonant
    else
        puts "Not have :"
    end
end

destroy_message("This message will self destruct: Ruby is fun ")
但我从第一辅音中什么也没得到。 我怎样才能修好它


谢谢

我只需在
处拆分
字符串,并使用第一部分。这可能比使用复杂的regexp引擎更快

string = "This message will self destruct: Ruby is fun "

string.split(':').first
#=> "This message will self destruct"

斯皮克曼的答案是可行的,但除此之外,还有一种方法
String#partition
专门用于做这类事情(也可能稍微快一点)

我从
第一辅音中什么也没有得到。我怎样才能修好它

你可以用

输出

 => have :
    This message will self destruct

关于使用的正则表达式的解释

  • ^
    断言我们处于一行的开头
  • [^…]
    与任何字符匹配但不匹配该特定字符类中存在的字符的求反字符类
  • +
    在char类之后,将重复char类一次或多次

无法使用
“此消息将自毁:Ruby很有趣”。split(':')[0]
=>“此消息将自毁”
您可以通过将
2
作为
split
的第二个参数来提高性能。您还可以使用
string.lazy.split(:”)。第一个
与换行有什么关系?虽然这可能有效,但与目前发布的其他方法相比,速度要慢得多。当发布一个更复杂的答案时,通常是为了逻辑清晰或性能,但从这个答案中,没有什么好处。@sawa我同意,但由于问题是关于编写自己的方法,而不是使用rubies内置方法,提问者也希望了解给定代码的问题。
s, * = "This message will self destruct: Ruby is fun ".partition(":")
s # => "This message will self destruct"
def destroy_message(sentence)
  if sentence.scan(/^[^:]+/)
    puts "have :"
    firstConsonant = sentence.scan(/^[^:]+/)
    puts firstConsonant[0]
  else
    puts "Not have :"
  end
end

destroy_message("This message will self destruct: Ruby is fun")
 => have :
    This message will self destruct