返回Ruby正则表达式的第一场比赛

时间:2009-02-06 08:42:21

标签: ruby regex string

我正在寻找一种在Ruby中对字符串执行正则表达式匹配的方法,并在第一次匹配时将其短路。

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

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

5 个答案:

答案 0 :(得分:123)

您可以尝试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"

答案 1 :(得分:51)

您可以使用[] :(类似于match

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

答案 2 :(得分:22)

如果仅存在匹配,则可以使用

/regexp/ =~ "string"

无论哪种方式,match应仅返回第一个匹配,而scan搜索整个字符串。因此,如果

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

答案 3 :(得分:4)

我还不确定这个功能是真棒还是完全疯狂,但你的正则表达式可以定义局部变量。

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

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

答案 4 :(得分:1)

正则表达式(正则表达式)只不过是一种有限状态机(FSM)。

FSM试图回答“这个状态是否可能?”的问题。

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

成功时,问题是“这种状态是否可能?”已经回答“是”。因此,不需要进一步匹配并且正则表达式返回。

有关详情,请参阅thisthis

此外:here is an interesting example演示正则表达式的工作原理。这里,正则表达式用于检测给定数字是否为素数。这个例子在perl中,但它也可以用ruby编写。