这个简单的代码做了什么?

时间:2011-12-23 12:37:38

标签: ruby regex

任何人都可以向我解释以下 Ruby 代码的作用是什么?

VARIABLE.scan /\((.+)\)$/

P.S。

如果VARIABLE=4,我得到[]

如果VARIABLE='aa',我得到[]

代码是做什么的?

3 个答案:

答案 0 :(得分:3)

/\((.+)\)$/

$是行尾锚点。最外面的()对被转义,因此它们将匹配字符串中的文字括号。 .+匹配一个或多个字符。

因此,正则表达式匹配以括号组结尾的字符串,其中至少包含一个字符,如:

qdqsqsddq(1)
sqkldj(azeazeza)

并捕获该组中的文字。

(请注意,它也匹配qsd(qsdq(qsdq),并且在这种情况下“返回”qsdq(qsdq,因此它的用处有点可疑。)

答案 1 :(得分:2)

/    # Regex delimiter
\(   # Match "("
(.+) # Match and capture one or more (+) characters (.), except newlines
\)   # Match ")"
$    # Match the end of the line (before any newlines, if present)
/    # Regex delimiter

.scan()搜索字符串并将所有匹配结果添加到数组中。

因此,实际上,它为您提供了多行字符串中所有行的数组,从行中的第一个左括号开始,直到行尾的右括号。

答案 2 :(得分:1)

要添加到其他帖子还有一件事:

If VARIABLE=4, I got []

这实际上引发了异常。你需要VARIABLE =“4”(注意:字符串.Fixnum没有这样的方法)。

我还举了一些例子:

"(4)".scan /\((.+)\)$/ # -> [["4"]]
"(42342)".scan /\((.+)\)$/ # -> [["42342"]]
"abracadabra (42342)".scan /\((.+)\)$/ # -> [["42342"]]
"abracadabra (42342) (23)".scan /\((.+)\)$/ # -> [["42342) (23"]].

# The regex do not match new lines by default.
"(4)\n(5)\n".scan /\((.+)\)$/ # -> [["4"], ["5"]]. 
"(4)\n(5)\n".scan /\((.+)\)$/m # -> [["4)\n(5"]]