http://www.perlmonks.org?node_id=319758


in reply to Regex to add space after punctuation sign

Previous solutions only considered commas and periods, not other punctuation symbols. Assuming anything that's not a word character or whitespace is to be considered punctuation, I would use:
s/(\d[,.]\d)|([^\w\s](?!\s))/$1 || "$2 "/ge;

Abigail

Replies are listed 'Best First'.
Re: Re: Regex to add space after punctuation sign
by dda (Friar) on Jan 08, 2004 at 09:52 UTC
    Thank you, Abigail. Can you please explain how does the replacement part of your expression work? If I understand correctly, /e evaluates $1 || "$2 " -- that way if $1 is not empty, it should not add second part?

    --dda

    P.S. I added end-of-line processings as was suggested by aragorn:
    s/(\d[,.]\d)|([^\w\s](?!\s)(?!$))/$1 || "$2 "/ge;
      Evaluating $1 || "$2 " means you get $1 if $1 is true (which means, anytime \d[.,]\d matches), otherwise you get $2 (the punctation character), followed by a space.

      I would handle end-of-line processing as follows:

      s/(\d[,.]\d)|([^\w\s])(?=\S)/$1 || "$2 "/ge;
      A single positive look-ahead is, IMO, more clear than two negative look-aheads.

      Abigail

        Thank you. You are the best!

        --dda