Ruby on rails 如何在ruby中分隔括号?

Ruby on rails 如何在ruby中分隔括号?,ruby-on-rails,ruby,arrays,string,Ruby On Rails,Ruby,Arrays,String,我一直在使用下面的代码来解决这个问题。我正在制作一个程序,将IUPAC名称更改为结构,因此我想分析用户输入的字符串。在IUPAC名称中也有括号。我想根据括号提取复合名称。我最后展示的方式 我想修改方式,使输出结果如下所示,并存储在一个数组中: As[“(4'-氰基联苯-4-基)”,“5-[(4'-氰基联苯-4-基)氧基], “({5-[(4'-氰基联苯-4-基)氧基]戊基}”……等等] 我写的拆分代码是: Reg_bracket=/([^(){}\[\]]*)([(){}\[\]])/

我一直在使用下面的代码来解决这个问题。我正在制作一个程序,将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'

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

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

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

您能发布您的输入和输出的示例吗want@IanKenney我已经在一开始发布了我想要的输出结果,我给出的输入是1-[({5-[(4'-氰基二苯基-4-基)氧基]戊基}氧基)羰基]乙烷化合物的IUPAC名称,输入字符串。嘿,Anup它不起作用,如果我输入这个,它就是不起作用。“4,4'{-1-[({5-[(4'-氰基苯基-4-基)氧基]戊氧基]羰基]-2-[(4'-氰基苯基-4-基)氧基]乙烯基]二己酸”我得到这个-->[“(4'-氰基苯基-4-基],“[(4'-氰基苯基-4-氧基)戊氧基],”,“{5-[(4'-氰基苯基-4-氰基]氧基]戊氧基],”]。你的预期产量是多少?应该是[“(4'-氰基联苯-4-基)”,“[(4'-氰基联苯-4-基)氧基],“{5-[(4'-氰基联苯-4-基)氧基]戊基],”({5-[(4'-氰基联苯-4-基)氧基]戊基]氧基],“{-1-[({5-[(4'-氰基联苯-4-基)氧基]戊基]氧基]羰基]-2-[(4'-氰基联苯)‌​nyl-4-基)氧基]乙烯},“4,4'{-1-[({5-[(4'-氰基联苯-4-基)氧基]戊基}氧基)羰基]-2-[(4'-氰基联苯‌​nyl-4-yl)oxy]ethylene}dihexanoic acid“]应该是这样的。我已经修改了代码以获得大多数模式。但是,要获得正确的输出,您需要一个能够处理类型2语法的解析器。我建议您在ruby中查找解析器。我仍然得到同样的输出,对我来说不起作用:/def xyz(str=nil)a=Array.new s=self我刚刚做了以下更改,但它不起作用。
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}