返回Ruby正则expression式的第一个匹配

我正在寻找一种方法来在Ruby中对string进行正则expression式匹配,并在第一次匹配时将其短路。

我正在处理的string很长,看起来像标准方式( match方法)将处理整个事情,收集每个匹配,并返回包含所有匹配的MatchData对象。

 match = string.match(/regex/)[0].to_s 

你可以尝试variableName[/regular expression/] 。 这是来自irb的输出示例:

 irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders" => "erik kalle johan anders erik kalle johan anders" irb(main):004:0> names[/kalle/] => "kalle" 

你可以使用[] :(这就像是match

 "foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches what is inside () # => "account2" "foo+account2@gmail.com"[/\+([^@]+)/, 0] # matches whole regexp # => "+account2" 

如果只有一场比赛的存在是重要的,你可以去

 /regexp/ =~ "string" 

无论哪种方式, match应该只返回第一个命中,而scansearch整个string。 所以如果

 matchData = "string string".match(/string/) matchData[0] # => "string" matchData[1] # => nil - it's the first capture group not a second match 

正则expression式(正则expression式)不过是一个有限状态机(FSM)。

FSM试图回答“这个状态是否可行?

它一直试图进行模式匹配,直到find匹配(成功),或者直到探索到所有path并且找不到匹配(失败)。

成功的时候,这个问题是否可行? 已经回答了“是”。 因此不需要进一步匹配,正则expression式返回。

看到这个和这个更多的这个。

进一步: 这里是一个有趣的例子来演示如何正则expression式的作品。 在这里,一个正则expression式用来检测给定数是否为素数。 这个例子是在Perl中,但它也可以用ruby编写。

我还不确定这个function是真棒还是完全疯狂,但你的正则expression式可以定义局部variables。

 /\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0 dollars #=> "3" 

(取自http://ruby-doc.org/core-2.1.1/Regexp.html )。