Hi I hope that it is OK to post this here, please say if not..... I''m pretty new to ruby and regular expressions. I would like to use a regular expression to match only numbers contained within square brackets. e.g. a sentence may be... [1] to [2], corresponding to [3] to [4] output using IRP 829 Version 2XX, [5] to [6] output using IRP 452 Version 3XX The numbers are refences to specifications in another table. At the moment, I use /\[\d*\]/ This extracts the numbers including brackets, but now can I just extract the numbers by altering the expression? The full ruby code I use for this is as follows if this is any use, probably also there is a better way than splitting on a space.... Any help would be great and really appreciated. Many thanks Darren <%if (opt=="display")%> <%cycles = 1 n = 0 @text_line = "" for part in @translation.text_line.split('' '') if ((/\[\d*\]/).match(part)) if (@fields[n]) @unit=@specification.get_unit(@fields[n].unit_id).name @prefix_new=@specification.get_prefix(@fields[n].prefix_id).name if (@translation.text_line.split('' '').size==cycles) @text_line = "#{@text_line}"+"#{@fields[n].result}"+" "+"#{@prefix_new}"+"#{@unit}" else @text_line = "#{@text_line}"+"#{@fields[n].result}"+" "+"#{@prefix_new}"+"#{@unit}"+" " end end n += 1 else if (@translation.text_line.split('' '').size==cycles) @text_line = @text_line+"#{part}" else @text_line = @text_line+"#{part}"+" " end end cycles += 1 end end%> -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
On Tue, Oct 24, 2006 at 08:23:31AM +0200, Darren Evans wrote:> > Hi > > I hope that it is OK to post this here, please say if not..... > > I''m pretty new to ruby and regular expressions. I would like to use a > regular expression to match only numbers contained within square > brackets. e.g. a sentence may be... > > [1] to [2], corresponding to [3] to [4] output using IRP 829 Version > 2XX, [5] to [6] output using IRP 452 Version 3XX > > The numbers are refences to specifications in another table. At the > moment, I use /\[\d*\]/ This extracts the numbers including brackets, > but now can I just extract the numbers by altering the expression? The > full ruby code I use for this is as follows if this is any use, probably > also there is a better way than splitting on a space.... > > Any help would be great and really appreciated.use () around the part of the match you want to extract, i.e. if part =~ /\[(\d*)\]/ puts $1 # $2 would mean the second group of (), and so on else ... end btw, you really should get that code out of your view, and put it into a helper or model... Jens -- Jens Krämer jk-UayuY8ajoWPk1uMJSBkQmQ@public.gmane.org --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Jens Thank you very much. I am not that good at sticking to the rules of Ruby on Rails and have probably suffered as a result. I have moved this to a model. The regular expression works well for long series as I require. However, it does not work for ([1]) for example. I would like to say "ignore everything before and after the square brackets. Does anyone have any ideas how to do this? I have tried a lot of symbols, but often I am not allowed to put these at the start. Many thanks Darren Jens Kraemer wrote:> On Tue, Oct 24, 2006 at 08:23:31AM +0200, Darren Evans wrote: >> 2XX, [5] to [6] output using IRP 452 Version 3XX >> >> The numbers are refences to specifications in another table. At the >> moment, I use /\[\d*\]/ This extracts the numbers including brackets, >> but now can I just extract the numbers by altering the expression? The >> full ruby code I use for this is as follows if this is any use, probably >> also there is a better way than splitting on a space.... >> >> Any help would be great and really appreciated. > > use () around the part of the match you want to extract, i.e. > > if part =~ /\[(\d*)\]/ > puts $1 # $2 would mean the second group of (), and so on > else > ... > end > > btw, you really should get that code out of your view, and put it > into a helper or model... > > Jens > > > -- > Jens Kr䭥r > jk-UayuY8ajoWPk1uMJSBkQmQ@public.gmane.org-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Darren Evans wrote:> The regular expression works well for long series as I require. However, > it does not work for ([1]) for example. I would like to say "ignore > everything before and after the square brackets.Um ... yes it does? irb(main):001:0> part = ''([1])'' => "([1])" irb(main):002:0> part => "([1])" irb(main):003:0> if part =~ /\[(\d*)\]/ irb(main):004:1> puts $1 irb(main):005:1> end 1 => nil irb(main):006:0> Maybe you should post your actual model code so we can try to see why it isn''t working for you ... -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi Then the problem as I see it is with the split, but I don''t know how to overcome this. Because of the way the split is handled [1] - ([2]) corresponding to [3] to [4] output using IQS 452 Version 2XX [5] to [6] output using IQS 452 Version 3XX (stored in the database) becomes [1] - [2] corresponding to [3] to [4] output using IQS 452 Version 2XX [5] to [6] output using IQS 452 Version 3XX Due to inadequacies in my model. The second line is a text line displayed (so the user can see what the final output will be with specifications and units included), but of course the way I do it the brackets around the [2] have disappeared What I want to do is to take the top line and just replace the [value] part but leave the brackets (could be anything else too, a comma, full stop etc). The important view part is as follows: <%unless @translation.text_line.nil?%> <%@text_line=@specification.display_text_line(@translation, @specification, @fields)%> <h5> <%if (@translation.level==1)%><b><%end%> <%if (@translation.level==2)%><b><%end%> <%if (@translation.level==3)%><%end%> <%if (@translation.level==4)%><li><%end%> <%if (@translation.level==5)%>  -  <%end%> <%if (@translation.level==6)%></h5><i><%end%> <%if (@translation.level==7)%><%if @mode!="list"%></h5><%else%></h6><%end%><%end%> <%=@translation.section%> <%if ((@translation.level==3) || (@translation.level==4) || (@translation.level==5))%>: <%end%> <%=@text_line%></b></i></h5></td></tr> <%end%> Probably, only the part @text_line is important, the rest is format stuff. The model is as follows: def display_text_line(translation, specification, fields) cycles = 1 n = 0 text_line = "" for part in translation.text_line.split('' '') if /\[(\d*)\]/.match(part) if (fields[n]) @unit=specification.get_unit(fields[n].unit_id).name @prefix_new=specification.get_prefix(fields[n].prefix_id).name if (translation.text_line.split('' '').size==cycles) text_line = "#{text_line}"+"#{fields[n].result}"+" "+"#{@prefix_new}"+"#{@unit}" else text_line = "#{text_line}"+"#{fields[n].result}"+" "+"#{@prefix_new}"+"#{@unit}"+" " end end n += 1 else if (translation.text_line.split('' '').size==cycles) text_line = text_line+"#{part}" else text_line = text_line+"#{part}"+" " end end cycles += 1 end return text_line end I hope that someone can help with this, I have tried a lot, but have failed to resolve this. Regards Darren Chris Gernon wrote:> Darren Evans wrote: >> The regular expression works well for long series as I require. However, >> it does not work for ([1]) for example. I would like to say "ignore >> everything before and after the square brackets. > > Um ... yes it does? > > irb(main):001:0> part = ''([1])'' > => "([1])" > irb(main):002:0> part > => "([1])" > irb(main):003:0> if part =~ /\[(\d*)\]/ > irb(main):004:1> puts $1 > irb(main):005:1> end > 1 > => nil > irb(main):006:0> > > Maybe you should post your actual model code so we can try to see why it > isn''t working for you ...-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi I have got to the stage where if I take the string (example): sadfas112f([1]),fds121a I want to extract everything after the somenumber] To do this I have at the moment: /\D*$/.match(part)[0] This gives: ]),fds121a Now all I want to do is tell the regular expression to ignore the "]", then I''m there. Does anyone know how to "ignore" a "]". Many thanks for your help. Darren Darren Evans wrote:> Hi > > Then the problem as I see it is with the split, but I don''t know how to > overcome this. Because of the way the split is handled > > [1] - ([2]) corresponding to [3] to [4] output using IQS 452 Version 2XX > [5] to [6] output using IQS 452 Version 3XX > > (stored in the database) becomes > > [1] - [2] corresponding to [3] to [4] output using IQS 452 Version 2XX > [5] to [6] output using IQS 452 Version 3XX > > Due to inadequacies in my model. > > The second line is a text line displayed (so the user can see what the > final output will be with specifications and units included), but of > course the way I do it the brackets around the [2] have disappeared > > What I want to do is to take the top line and just replace the [value] > part but leave the brackets (could be anything else too, a comma, full > stop etc). > > The important view part is as follows: > > <%unless @translation.text_line.nil?%> > <%@text_line=@specification.display_text_line(@translation, > @specification, @fields)%> > <h5> > <%if (@translation.level==1)%><b><%end%> > <%if (@translation.level==2)%><b><%end%> > <%if (@translation.level==3)%><%end%> > <%if (@translation.level==4)%><li><%end%> > <%if (@translation.level==5)%>  -  <%end%> > <%if (@translation.level==6)%></h5><i><%end%> > <%if (@translation.level==7)%><%if > @mode!="list"%></h5><%else%></h6><%end%><%end%> > <%=@translation.section%> > <%if ((@translation.level==3) || (@translation.level==4) || > (@translation.level==5))%>: <%end%> > <%=@text_line%></b></i></h5></td></tr> > > <%end%> > > Probably, only the part @text_line is important, the rest is format > stuff. The model is as follows: > > def display_text_line(translation, specification, fields) > cycles = 1 > n = 0 > text_line = "" > for part in translation.text_line.split('' '') > if /\[(\d*)\]/.match(part) > if (fields[n]) > > @unit=specification.get_unit(fields[n].unit_id).name > @prefix_new=specification.get_prefix(fields[n].prefix_id).name > if (translation.text_line.split('' '').size==cycles) > text_line = "#{text_line}"+"#{fields[n].result}"+" > "+"#{@prefix_new}"+"#{@unit}" > else > text_line = "#{text_line}"+"#{fields[n].result}"+" > "+"#{@prefix_new}"+"#{@unit}"+" " > end > end > n += 1 > else > if (translation.text_line.split('' '').size==cycles) > text_line = text_line+"#{part}" > else > text_line = text_line+"#{part}"+" " > end > end > cycles += 1 > end > return text_line > end > > I hope that someone can help with this, I have tried a lot, but have > failed to resolve this. > > Regards > > Darren > > > > > > > > > > Chris Gernon wrote: >> Darren Evans wrote: >>> The regular expression works well for long series as I require. However, >>> it does not work for ([1]) for example. I would like to say "ignore >>> everything before and after the square brackets. >> >> Um ... yes it does? >> >> irb(main):001:0> part = ''([1])'' >> => "([1])" >> irb(main):002:0> part >> => "([1])" >> irb(main):003:0> if part =~ /\[(\d*)\]/ >> irb(main):004:1> puts $1 >> irb(main):005:1> end >> 1 >> => nil >> irb(main):006:0> >> >> Maybe you should post your actual model code so we can try to see why it >> isn''t working for you ...-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
A regular expression like /^(.*)\[(\d*)\](.*)$/ will let you capture all three parts of the string you appear to be interested in. However, are you sure you will never have two sets of numbers within square brackets (e.g. "[3]") that are not separated by a space (e.g. "abcd[1]efgh[2]ijkl")? Because a standard regular expression match will only match once in a string. An example: Program: -------- #!/usr/bin/env ruby -w regexp = /^(.*)\[(\d*)\](.*)$/ part = ''sadfas112f([1]),fds121a'' match = regexp.match(part) puts "part = ''#{part}''" puts "match[1] = #{match[1]}" puts "match[2] = #{match[2]}" puts "match[3] = #{match[3]}" puts part = ''sadfas112f([1]),fd[2]s121a'' match = regexp.match(part) puts "part = ''#{part}''" puts "match[1] = #{match[1]}" puts "match[2] = #{match[2]}" puts "match[3] = #{match[3]}" Output: ------- part = ''sadfas112f([1]),fds121a'' match[1] = sadfas112f( match[2] = 1 match[3] = ),fds121a part = ''sadfas112f([1]),fd[2]s121a'' match[1] = sadfas112f([1]),fd match[2] = 2 match[3] = s121a If you''re sure this won''t be an issue for you, then this technique should work. If not, you probably want to look at gsub or scan, as discussed in this thread: http://www.ruby-forum.com/topic/84445 However, I have to say that the code for your model method looks very complicated, and I honestly can''t figure out what it is supposed to do. Can you describe what it is does? I (or someone else here) may be able to rework it into something simpler and more readable. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Dear Chris Thank you very much for this advice. I have something that works now how I want it to (using your regular expression), even if it''s not the prettiest code in the world. I may come back later with a description of what I have done if that is OK with you? There must be an easier way to do this (but it is fairly complex anyway). It''s my first effort with Ruby on Rails (with very limited support), though I do have a reasonable amount of experience with php. My code starts to look like php too often at the moment, I know that & will work on it. Thanks again, it''s really appreciated. Regards Darren Chris Gernon wrote:> A regular expression like /^(.*)\[(\d*)\](.*)$/ will let you capture all > three parts of the string you appear to be interested in. However, are > you sure you will never have two sets of numbers within square brackets > (e.g. "[3]") that are not separated by a space (e.g. > "abcd[1]efgh[2]ijkl")? Because a standard regular expression match will > only match once in a string. > > An example: > > Program: > -------- > #!/usr/bin/env ruby -w > > regexp = /^(.*)\[(\d*)\](.*)$/ > > part = ''sadfas112f([1]),fds121a'' > match = regexp.match(part) > puts "part = ''#{part}''" > puts "match[1] = #{match[1]}" > puts "match[2] = #{match[2]}" > puts "match[3] = #{match[3]}" > puts > > part = ''sadfas112f([1]),fd[2]s121a'' > match = regexp.match(part) > puts "part = ''#{part}''" > puts "match[1] = #{match[1]}" > puts "match[2] = #{match[2]}" > puts "match[3] = #{match[3]}" > > Output: > ------- > part = ''sadfas112f([1]),fds121a'' > match[1] = sadfas112f( > match[2] = 1 > match[3] = ),fds121a > > part = ''sadfas112f([1]),fd[2]s121a'' > match[1] = sadfas112f([1]),fd > match[2] = 2 > match[3] = s121a > > If you''re sure this won''t be an issue for you, then this technique > should work. If not, you probably want to look at gsub or scan, as > discussed in this thread: http://www.ruby-forum.com/topic/84445 > > However, I have to say that the code for your model method looks very > complicated, and I honestly can''t figure out what it is supposed to do. > Can you describe what it is does? I (or someone else here) may be able > to rework it into something simpler and more readable.-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---