Replace any multiple whitespaces with single white space

Discussion in 'Ruby' started by Michelle Pace, Apr 25, 2011.

  1. Hello, I need to make the first string below into the second string.
    That is, only single white spaces are permitted.

    "1/4 WELDING LEVER FRONT DRW 14844-C MAT WMA1CM-WLFRONT"
    into
    "1/4 WELDING LEVER FRONT DRW 14844-C MAT WMA1CM-WLFRONT"



    I want to use the sub! method. Why does the below code not work? Is my
    pattern incorrect?

    descrip = "1/4 WELDING LEVER FRONT DRW 14844-C MAT WMA1CM-WLFRONT"
    descrip.sub!(/\s+/,' ')
    puts descrip



    Thank-you in advance,
    Michelle
     
    Michelle Pace, Apr 25, 2011
    #1
    1. Advertisements

  2. sub! only affects the *first* match. You can substitute globally with
    gsub. Also you might as well only match 2 or more spaces:

    descrip.gsub!(/\s\s+/,' ')
     
    Joel VanderWerf, Apr 25, 2011
    #2
    1. Advertisements

  3. [Note: parts of this message were removed to make it a legal post.]

    Good Morning Michelle,

    Sub only replaces the first instance of the pattern. You require gsub! to
    accomplish your task.

    You noticed no difference with your sub! call because the first instance of
    your pattern is the single space between 1/4 and WELDING so in essence sub!
    did nothing to your string because it replaced a single space with a single
    space.

    John
     
    John W Higgins, Apr 25, 2011
    #3
  4. Michelle Pace

    Josh Cheek Guest

    [Note: parts of this message were removed to make it a legal post.]

    I think the original regex is better, because leads to more consistent
    results:

    "hello\tworld !".gsub(/\s\s+/,' ') # => "hello\tworld !"
    "hello\tworld !".gsub(/\s+/,' ') # => "hello world !"
     
    Josh Cheek, Apr 25, 2011
    #4
  5. Good point, but it depends on what you're trying to be consistent with.
    Maybe the goal is to squeeze space, but preserve tab layout for readability.
     
    Joel VanderWerf, Apr 25, 2011
    #5
  6. [Note: parts of this message were removed to make it a legal post.]

    There is also the build-in method squeeze!, which does exacly this

    str.squeeze!(" ")
     
    Gunther Diemant, Apr 25, 2011
    #6
  7. Try gsub for multiple characters - Try code below:=20
    =20
    descrip =3D "1/4 WELDING LEVER FRONT DRW 14844-C MAT WM=
    A1CM-WLFRONT"
    puts descrip.gsub!(/\s+/=2C' ') =
     
    Alexander McMillan, Apr 26, 2011
    #7
  8. Joel VanderWerf wrote in post #994935:
    Those are not equivalent, because \s matches more than just ASCII 0x20.

    d1 = "foo\tbar\tbaz"
    d1.gsub(/\s+/,' ') # "foo bar baz"
    d1.gsub(/\s\s+/,' ') # "foo\tbar\tbaz"
     
    Brian Candler, Apr 26, 2011
    #8
  9.  
    Joel VanderWerf, Apr 26, 2011
    #9
  10. You're right. What I said in another post about preserving tabs isn't
    what the original sub! call was doing anyway.

    (sorry for the empty reply previously)
     
    Joel VanderWerf, Apr 26, 2011
    #10
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.