【问题标题】:How to separate brackets in ruby?如何在ruby中分隔括号?
【发布时间】:2015-07-05 15:39:53
【问题描述】:

我一直在使用以下代码来解决这个问题。我正在制作一个将 IUPAC 名称更改为结构的程序,所以我想分析用户输入的字符串。在 IUPAC 名称中也有括号。我想根据括号提取复合名称。我最后展示的方式。

我想修改方式,使输出变成这样并存储在数组中:

As ["(4'-氰基联苯-4-基)","5-[(4'-氰基联苯-4-基)氧基]", "({5-[(4'-氰基联苯-4-基)氧基]戊基}" ....等]

我写的分割代码是:

    Reg_bracket=/([^(){}\[\]]*)([(){}\[\]])/

    attr_reader :obrk, :cbrk     
    def count_level_br
        @xbrk=0
        @cbrk=0
        if  @temp1 
          @obrk+=1 if @temp1[1]=="(" || @temp1[1]=="[" ||@temp1[1]=="{"  
          @obrk-=1 if @temp1[1]==")" || @temp1[1]=="]" ||@temp1[1]=="}"
       end
       puts @obrk.to_s
    end

    def split_at_bracket(str=nil) #to split the brackets according to Regex
        if str a=str
        else a=self
        end
        a=~Reg_bracket
        if $& @temp1=[$1,$2,$']
        end
        @temp1||=[a,"",""]
      end


      def find_block
       @obrk=0 , r=""
       @temp1||=["",""]
        split_at_bracket
        r<<@temp1[0]<<@temp1[1]              
             count_level_br
       while @obrk!=0                  
          split_at_bracket(@temp1[2])
         r<<@temp1[0]<<@temp1[1]
         count_level_br
        puts r.to_s
         if @obrk==0
          puts "Level 0 has reached"
          #puts "Close brackets are #{@cbrk}"
           return r 
         end
       end #end

      end
    end #class end'

我使用了正则表达式来匹配括号。然后当它找到任何括号时,它会给出匹配前、匹配后和匹配后第二个的结果,然后继续执行直到结束。

我现在得到的输出是这样的。

1
2
1-[(
3
1-[({
4
1-[({5-[
5
1-[({5-[(
4
1-[({5-[(4'-cyanobiphenyl-4-yl)
3
1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]
2
1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}
1
1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)
0
1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]
Level 0 has reached
testing ends'

【问题讨论】:

  • 你能发布你所拥有的输入和你想要的输出的样本
  • @IanKenney 我一开始就发布了我想要的输出结果。我给出的输入类似于 1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl] ethane 化合物的 IUPAC 名称,输入字符串。

标签: ruby-on-rails ruby arrays string


【解决方案1】:

我编写了一个简单的程序来使用三个不同的正则表达式匹配字符串。第一个将帮助分离括号,第二个将分离方括号,第三个将给出花括号。这是以下代码。我希望你能在你的程序中有效地使用它。

reg1 = /(\([a-z0-9\'\-\[\]\{\}]+.+\))/ # for parenthesis
reg2 = /(\[[a-z0-9\'\-\(\)\{\}]+.+\])/ # for square brackets
reg3 = /(\{[a-z0-9\'\-\(\)\[\]]+.+\})/ # for curly braces  

a = Array.new 
s = gets.chomp

x = reg1.match(s)
a << x.to_s
str = x.to_s.chop.reverse.chop.reverse
while x != nil do
    x = reg1.match(str)
    a << x.to_s
    str = x.to_s.chop
end

x = reg2.match(s)
a << x.to_s
str = x.to_s.chop.reverse.chop.reverse
while x != nil do
        x = reg2.match(str)
        a << x.to_s
        str = x.to_s.chop
end

x = reg3.match(s)
a << x.to_s
str = x.to_s.chop.reverse.chop.reverse
while x != nil do
        x = reg3.match(str)
        a << x.to_s
        str = x.to_s.chop
end

puts a

输出如下:

ruby reg_yo.rb 
4,4'{-1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]-2-[(4'-cyanobiphe‌​nyl-4-yl)oxy]ethylene}dihexanoic acid # input string

({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]-2-[(4'-cyanobiphe‌​nyl-4-yl)
(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)
(4'-cyanobiphenyl-4-yl)

[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]-2-[(4'-cyanobiphe‌​nyl-4-yl)oxy]
[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]
[(4'-cyanobiphenyl-4-yl)oxy]

{-1-[({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)carbonyl]-2-[(4'-cyanobiphe‌​nyl-4-yl)oxy]ethylene}
{5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}

更新:我已经修改了代码以便搜索递归模式。

【讨论】:

  • Hey Anup 它不起作用,如果我输入它就不起作用。 "4,4'{-1-[({5-[(4'-氰基联苯-4-基)氧基]戊基}氧基)羰基]-2-[(4'-氰基联苯-4-基)氧基]乙烯}二己酸”
  • 我明白了 --> ["(4'-cyanobiphenyl-4-yl)", "[(4'-cyanobiphenyl-4-yl)oxy]", "{5-[( 4'-氰基联苯-4-基)氧基]戊基}"]。您的预期输出是什么?
  • 应该是 ["(4'-cyanobiphenyl-4-yl)", "[(4'-cyanobiphenyl-4-yl)oxy]", "{5-[(4'- cyanobiphenyl-4-yl)oxy]pentyl}", "({5-[(4'-cyanobiphenyl-4-yl)oxy]pentyl}oxy)", "{-1-[({5-[(4' -氰基联苯-4-基)氧基]戊基}氧基)羰基]-2-[(4'-氰基联苯‌​nyl-4-基)氧基]乙烯}" , "4,4'{-1-[({5 -[(4'-氰基联苯-4-基)氧基]戊基}氧基)羰基]-2-[(4'-氰基联苯‌​nyl-4-基)氧基]乙烯}二己酸"]应该是这个。
  • 我已经修改了代码以获得大部分模式。但是,要获得正确的输出,您将需要一个可以处理类型 2 语法的解析器。我建议您在 ruby​​ 中查找解析器。 Here.
  • 我仍然得到相同的输出,但对我不起作用:/ def xyz(str=nil) a=Array.new s=self 我刚刚进行了以下更改,但它不起作用。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2014-01-11
  • 2011-06-30
相关资源
最近更新 更多