Is there an easier way to get a match before a position in a string?

I am trying to find an easier way to split a string into printable lines. I could use the method of checking for a space using a loop and going back from the desired length or I could use the following:

def strbrk(str, len)
   if str.length <= len
     return str.length
   end
   tmp = str[0...len].reverse
   x = tmp =~ / /
   if x == nil
     return -1
     else
       return len - x
   end
end

I could not find any way to get a regexp to search from the end of the string which would have eliminated the need to reverse the string.

str.rindex(/ /, len) ?

···

On Jan 22, 2008 5:14 AM, Michael W. Ryder <_mwryder@worldnet.att.net> wrote:

I could not find any way to get a regexp to search from the end of the
string which would have eliminated the need to reverse the string.

This should work:

/ [^ ]*$/

It looks for one space, followed by 0 or more occurrences of anything
besides a space, followed by the end of the string.

···

On Jan 21, 1:12 pm, "Michael W. Ryder" <_mwry...@worldnet.att.net> wrote:

I am trying to find an easier way to split a string into printable
lines. I could use the method of checking for a space using a loop and
going back from the desired length or I could use the following:

def strbrk(str, len)
   if str.length <= len
     return str.length
   end
   tmp = str[0...len].reverse
   x = tmp =~ / /
   if x == nil
     return -1
     else
       return len - x
   end
end

I could not find any way to get a regexp to search from the end of the
string which would have eliminated the need to reverse the string.

def str_break( str, len )
  str.size > len and str[0..len].rindex(' ') or str.size
end

str = "\
I don't necessarily need code examples -- but if anyone has
ideas for a best approach to specifying a line wrap width
(breaking between words for lines no longer than a specific
column width) for output from a Ruby script, I'd love to
hear about it."

X = 40
puts str.gsub(/\n/," ").scan(/\S.{0,#{X-2}}\S(?=\s|$)|\S+/)

···

On Jan 21, 1:12 pm, "Michael W. Ryder" <_mwry...@worldnet.att.net> wrote:

I am trying to find an easier way to split a string into printable
lines. I could use the method of checking for a space using a loop and
going back from the desired length or I could use the following:

def strbrk(str, len)
   if str.length <= len
     return str.length
   end
   tmp = str[0...len].reverse
   x = tmp =~ / /
   if x == nil
     return -1
     else
       return len - x
   end
end

I could not find any way to get a regexp to search from the end of the
string which would have eliminated the need to reverse the string.

William James wrote:

I am trying to find an easier way to split a string into printable
lines. I could use the method of checking for a space using a loop and
going back from the desired length or I could use the following:

def strbrk(str, len)
   if str.length <= len
     return str.length
   end
   tmp = str[0...len].reverse
   x = tmp =~ / /
   if x == nil
     return -1
     else
       return len - x
   end
end

I could not find any way to get a regexp to search from the end of the
string which would have eliminated the need to reverse the string.

def str_break( str, len )
  str.size > len and str[0..len].rindex(' ') or str.size
end

This is much better than my solution, I missed rindex somehow.

···

On Jan 21, 1:12 pm, "Michael W. Ryder" <_mwry...@worldnet.att.net> > wrote:

str = "\
I don't necessarily need code examples -- but if anyone has
ideas for a best approach to specifying a line wrap width
(breaking between words for lines no longer than a specific
column width) for output from a Ruby script, I'd love to
hear about it."

X = 40
puts str.gsub(/\n/," ").scan(/\S.{0,#{X-2}}\S(?=\s|$)|\S+/)

William James wrote:
...

str = "\
I don't necessarily need code examples -- but if anyone has
ideas for a best approach to specifying a line wrap width
(breaking between words for lines no longer than a specific
column width) for output from a Ruby script, I'd love to
hear about it."

X = 40
puts str.gsub(/\n/," ").scan(/\S.{0,#{X-2}}\S(?=\s|$)|\S+/)

Kaspar Schiess wrote text-reform (gem install text-reform)

require 'text/reform'

r = Text::Reform.new
while line=gets
    puts r.format('['*40, line)
end

Here he says it does hyphenate:
http://blog.macromates.com/2006/wrapping-text-with-regular-expressions/

···

--
Posted via http://www.ruby-forum.com/\.

William James wrote:

I am trying to find an easier way to split a string into printable
lines. I could use the method of checking for a space using a loop and
going back from the desired length or I could use the following:

def strbrk(str, len)
   if str.length <= len
     return str.length
   end
   tmp = str[0...len].reverse
   x = tmp =~ / /
   if x == nil
     return -1
     else
       return len - x
   end
end

I could not find any way to get a regexp to search from the end of the
string which would have eliminated the need to reverse the string.

def str_break( str, len )
  str.size > len and str[0..len].rindex(' ') or str.size
end

I did find one more "improvement" on your code after reading further on rindex.

def str_break( str, len )
   str.size > len and str.rindex(' ', len) or str.size
end

It appears to work the same and give the same results but I am not sure if there was a reason for the way you did it that I missed.
Thanks for the push in the right direction.

···

On Jan 21, 1:12 pm, "Michael W. Ryder" <_mwry...@worldnet.att.net> > wrote:

str = "\
I don't necessarily need code examples -- but if anyone has
ideas for a best approach to specifying a line wrap width
(breaking between words for lines no longer than a specific
column width) for output from a Ruby script, I'd love to
hear about it."

X = 40
puts str.gsub(/\n/," ").scan(/\S.{0,#{X-2}}\S(?=\s|$)|\S+/)