【问题标题】:ruby regex with variable optionals带有可变选项的 ruby​​ 正则表达式
【发布时间】:2014-03-12 17:24:38
【问题描述】:

我无法找出解析一组特定字符串的最佳方法。

我将遇到的一些字符串示例如下:

str = 'name[key1][key2][key3]'
str2 = 'name[key1]'
str3 = 'name'

以下是我希望摆脱字符串的各个数组:

arr1 = ['name', 'key1', 'key2', 'key3']
arr2 = ['name', 'key1']
arr3 = ['name']

如您所见,键是可选的,可以是变量计数。

我能做到的最接近的是:

>> str = 'name[key1][key2][key3]'
"name[key1][key2][key3]"

>> str.scan(/(.+?)(\[.+?\])/)
[["name", "[key1]"], ["[key2]", "[key3]"]]

所以,我总是可以在那个数组上做一个展平,然后用一个 gsub 来去掉括号,但我不想把它混在一起。我希望能够一口气完成它。我考虑只在括号处进行字符串拆分,但这似乎也有点像创可贴的方法。如果有人对我如何比正则表达式更好地完成这一点有想法,或者我如何使用我正在使用的方法正确地完成这一点,那就太好了!

【问题讨论】:

    标签: ruby regex arrays


    【解决方案1】:

    您可以使用scan 并忽略括号:

    str = 'name[key1][key2][key3]'
    p str.scan(/[^\[\]]+/)
    #=> ["name", "key1", "key2", "key3"]
    
    str2 = 'name[key1]'
    p str2.scan(/[^\[\]]+/)
    #=> ["name", "key1"]
    
    str3 = 'name'
    p str3.scan(/[^\[\]]+/)
    #=> ["name"]
    

    【讨论】:

    • 对不起,我尝试了第一个看起来也最简单的答案。谢谢大家的回复,这恰好工作得很好!正则表达式对我来说绝对是一个弱点:)
    【解决方案2】:

    您可以使用正向前瞻/后向查找来查找可能存在的括号,但将它们从匹配中排除。那么你根本不必使用gsubflatten

    str = 'name[key1][key2][key3]'
    p str.scan(/(?<=\[)?\w+(?=\])?/)
    # => ["name", "key1", "key2", "key3"]
    

    Ruby Docs 中阅读有关 Regexp 类的更多信息。

    【讨论】:

      【解决方案3】:

      使用拆分??

      str = 'name[key1][key2][key3]'
      print str.split(/[\[\]]+/)
      

      【讨论】:

        【解决方案4】:

        这对你有用:

        str.tr('[]', '  ').split
        

        '['']' 都更改为' ',然后在' ' 上拆分

        如果您需要更改为 ' ' 的字符数增加,请将 tr() 更改为 gsub() 并相应地修改参数

        【讨论】:

          猜你喜欢
          • 2012-05-10
          • 1970-01-01
          • 1970-01-01
          • 2014-06-08
          • 1970-01-01
          • 2016-06-06
          • 2018-08-15
          • 1970-01-01
          相关资源
          最近更新 更多