正则表达式提取两个字符串之间的串

时间:2010-08-31 22:09:18

标签: ruby regex

我正在尝试使用regexp提取字符串。例如,在以下字符串中:

select DESCENDANTS([Customer].[Yearly Income],,LEAVES) on axis(0),
       DESCENDANTS([Sales Territory].[Sales Territory],,LEAVES) on axis(1),
       DESCENDANTS([Customer].[Total Children],,LEAVES) on axis(2)
  from [Adventure Works]
 where [Measures].[Internet Sales Amount]

我想在每对“DESCENDANTS(”和“,,”之间)中提取子字符串。

因此,本案例的结果为:[Customer].[Yearly Income], [Sales Territory].[Sales Territory], [Customer].[Total Children]

感谢任何帮助。提前谢谢。

4 个答案:

答案 0 :(得分:4)

如果您的文字名为query,请执行以下操作:

query.scan(/DESCENDANTS\((.+),,/).flatten
=> ["[Customer].[Yearly Income]", "[Sales Territory].[Sales Territory]",
"[Customer].[Total Children]"]

一些注意事项:

  • \(与文字开放式括号相匹配
  • (.+)会记住开括号和两个逗号之间的字符作为捕获
  • 如果正则表达式包含捕获(),则scan将为每个匹配返回捕获部分的数组数组。在这种情况下,每个匹配只有1次捕获,因此可以使用flatten返回我们感兴趣的所有匹配项的单个数组。

答案 1 :(得分:1)

/DESCENDANTS\(([^,]+),,/

rubular

上查看

答案 2 :(得分:0)

这是一个使用split的更丑陋的变体:拆分为“DESCENDANTS(”和“,,”,并采用其他所有子字符串:

s.split(/DESCENDANTS\(|,,/).each_with_index.inject([]) {|m,(e,i)| m << e if i.odd?; m}

答案 3 :(得分:0)

。+?更安全,如果SQL在一行中,它可以正常工作。

query.scan(/DESCENDANTS\((.+?),,/).flatten