我正在尝试使用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]
感谢任何帮助。提前谢谢。
答案 0 :(得分:4)
如果您的文字名为query
,请执行以下操作:
query.scan(/DESCENDANTS\((.+),,/).flatten
=> ["[Customer].[Yearly Income]", "[Sales Territory].[Sales Territory]",
"[Customer].[Total Children]"]
一些注意事项:
\(
与文字开放式括号相匹配(.+)
会记住开括号和两个逗号之间的字符作为捕获()
,则scan
将为每个匹配返回捕获部分的数组数组。在这种情况下,每个匹配只有1次捕获,因此可以使用flatten
返回我们感兴趣的所有匹配项的单个数组。答案 1 :(得分:1)
/DESCENDANTS\(([^,]+),,/
上查看
答案 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