0

我想使用正则表达式来解决这个问题。我对其他简短有效的想法持开放态度。

使用任何方法和其他任何方法:

split()
scan()
match()

Q#1 我想返回一个单词的字母个数

def first_letters(str, num)
  str.scan(/...???/
end

first_letters ("hello", 1) ==> returns "h"
first_letters ("hello", 3) ==> returns "hel"
first_letters ("John", 2) ==> returns "Jo"

Q#2 返回第一个单词

def first_word(str)       
   str.scan(/?...?/
end

   first_word("hello world")  ==> return "hello"
   first_word("Hey You")  ==> return "Hey"
4

3 回答 3

3

您不需要使用正则表达式。

def first_letters(str, num)
  str[0, num]
end


def first_word(str)       
   str.split[0]
end

使用正则表达式:

def first_letters(str, num)
  str[Regexp.new("^.{#{num}}")]
end

def first_word(str)       
   str[/\w+/] # or str[/\S+/]
end
于 2013-10-29T02:09:59.020 回答
1

虽然您想学习正则表达式令人钦佩,但您的约束并不是正则表达式的好用例,而是设计得很糟糕。

可以使用模式和其中之一检索前n 个字母:

str = 'foobar'
str.scan(Regexp.new("^.{3}")).first # => "foo"
str.split(//)[0, 3].join # => "foo"
str.match(/^(.{3})/)[1] # => "foo"

但是,为什么,当分割字符串更直接和简单的时候呢?

str[0, 3] # => "foo"

可以使用模式和其中之一检索第一个单词:

str = 'foo bar'
str.scan(Regexp.new("\S+")).first # => nil
str.scan(Regexp.new("\w+")).first # => nil
str.split(/ /)[0] # => "foo"
str.match(/^([a-z]+)/i)[1] # => "foo"

或者直接做:

str.split[0] # => "foo"
str.split.first # => "foo"

split在内部使用正则表达式"foo bar"通过查找“空白”将其分成两个词,但它对我们隐藏了它,所以从技术上讲它正在使用它们,但我们并没有真正看到它。)

知道为什么以及何时应该使用正则表达式非常重要。当您想从文本中检索重复出现的数据模式时,它们非常有用,例如混合在文本中的数字、看起来像 IP 编号的东西,或者撕开 HTTP 服务器日志文件(有时最好使用字符串切片来完成)。

于 2013-10-29T06:12:39.097 回答
1

返回“n”个字母或单词“n”不是你用正则表达式做的事情。

def first_letters(str, num)
  str[0,num]
end

2.0.0-p247 :023 > first_letters("hello", 1)  
 => "h" 
2.0.0-p247 :024 > first_letters("hello", 3)  
 => "hel" 
2.0.0-p247 :025 > first_letters("John", 2)  
 => "Jo" 

def first_word(str)       
   str.split[0]
end

2.0.0-p247 :033 > first_word("hello world")                                     
 => "hello" 
2.0.0-p247 :034 > first_word("Hey You")
 => "Hey" 

当您想要基于模式进行匹配时,使用正则表达式。

例如,假设您想匹配任何以空格开头的行、单词浏览器、“点”和以 )} 结尾的行

为此,您将使用此:/^[[:space]]*browser\..*\)\}/ 正如您所见,它使用模式进行匹配,因此它将选择以下行:

browsers {( all )}
  browser with more words here {( all )}
     browser even when missing brackets here all )}

但它不会匹配并选择如下行:

browsers {( all )
  rowsers with more words {( all )}
     browsers  ([])

所以作为一种方法

def first_word(str)       
  str.match(/^[[:space]]*browser\..*\)\}/)    
end
于 2013-10-29T02:07:10.670 回答