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