解析单个键/值的字符串的“ruby方式”是什么?

时间:2009-05-22 20:55:30

标签: ruby regex text

我正在尝试解析一个多行字符串,并按照模式获取该行的其余部分。

文本:

hello john
your username is: jj
thanks for signing up

我想在“你的用户名是:”

之后提取jj,即所有内容

一种方式:

text = "hello john\nyour username is: jj\nthanks for signing up\n"
match = text[/your username is: (.*)/]
value = $1

但是这让我想起了perl ......并且不像我告诉ruby那样自然地“阅读”。

有更清洁的方式吗? AKA是一种“红宝石”的方式吗?

由于

4 个答案:

答案 0 :(得分:22)

您的代码几乎是Ruby方式。如果您不想使用全局$1,则可以使用2个arg版本String#[]

match = text[/your username is: (.*)/, 1]

答案 1 :(得分:6)

split 命令令人难以置信。它将一个字符串分成一个子串数组,分隔你传入的任何内容。如果你没有给它任何参数,它就会在空格上分割。所以如果你知道你要找的单词是第五个“单词”(在空格和返回字符上分开),你可以这样做:

  

text =“你好john \ nyour用户名是:jj \ nthanks用于注册\ n”

  匹配= text.split [5]

..但也许这不足以自我记录,或者你想允许多字匹配。你可以这样做:

  

中线= text.split( “\ n” 个)[1]
  match = midline.split(“username is:”).last

或者这可能是更简洁的方式:

  

match = text [/ username is:(。*)/,1]

答案 2 :(得分:4)

不确定它是否是Ruby'ish,但另一种选择:

>> text = "hello john\nyour username is: jj\nthanks for signing up\n"
>> text.match(/your username is: (.*)/)[1]
=> "jj"

答案 3 :(得分:3)

还有Regexp#match,它返回一个MatchData对象,其中包含您可能想要的所有信息。

irb> match = /your username is: (.*)/.match "hello john\nyour username is: jj\nthanks for signing up\n"
#=> #<MatchData:0x557f94>
irb> match.pre_match
#=> "hello john\n"
irb> match.post_match
#=> "\nthanks for signing up\n"
irb> match[0]
#=> "your username is: jj"
irb> match[1]
#=> "jj"