【问题标题】:regular expression extract string between two strings正则表达式提取两个字符串之间的字符串
【发布时间】:2010-08-31 22:09:18
【问题描述】:

我正在尝试使用正则表达式提取字符串。例如在以下字符串中:

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]

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

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    如果您将文本放在名为query 的字符串中,您可以这样做:

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

    一些注意事项:

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

    【讨论】:

      【解决方案2】:
      /DESCENDANTS\(([^,]+),,/
      

      查看rubular

      【讨论】:

      • 这将排除碰巧包含逗号的后代。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-30
          • 2014-06-12
          • 2017-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          相关资源
          最近更新 更多