3

我有以下字符串:

Eclipse Developments (Scotland) Ltd t/a Martin & Co (Glasgow South)

我需要得到最后一个(总是最后一个,但有时是唯一的)括号值,所以在这种情况下是“Glasgow South”。

我知道我应该使用.sub但无法计算出正确的正则表达式。

4

2 回答 2

22

通常sub用于替换。你需要的是scan

test = "Eclipse Developments (Scotland) Ltd t/a Martin & Co (Glasgow South)"

test.scan(/\(([^\)]+)\)/).last.first
# => "Glasgow South"

.last.first奇数调用的原因是scan默认返回一个数组数组。您想要最后一场比赛的第一个(也是唯一一个)元素。

翻译那个正则表达式,这对于初学者来说可能很棘手:

\(     # A literal bracket followed by...
(      # (Memorize this)
[^)]+  # One or more (+) characters not in the set of: closing-bracket [^)]
)      # (End of memorization point)
\)     # ...and a literal closing bracket.
于 2012-06-12T16:24:14.860 回答
2

正则表达式是贪婪的;如果您要求,.*它将尽可能匹配。因此,以下将起作用:

test = "Eclipse Developments (Scotland) Ltd t/a Martin & Co (Glasgow South)"
test =~ /.*\((.*)\)/
answer = $1
# => "Glasgow South"
于 2012-06-12T16:26:47.580 回答