On Feb 25, 2008, at 6:43 AM, Robert Klemme wrote: > 2008/2/25, Glenn <glenn_ritz / yahoo.com>: >> Hello, >> >> I'm wondering if there is a method for the String class that splits >> a string on some characters and keeps the split characters in the >> elements of the resulting array? >> >> The split method returns an array in this example: >> >> p "This is a sentence. This is a sentence! This is a >> sentence?".strip.split(/\.|\?|\!/) >> >> >> ["This is a sentence", " This is a sentence", " This is a sentence"] >> >> The three sentences in the above string have very different >> meanings, but loose those meanings without the punctuation, so I'd >> like to keep the punctuation. I'd like a method that keeps the >> split characters, and returns this array: >> >> ["This is a sentence.", " This is a sentence!", " This is a >> sentence?"] >> >> Does such an array exist? If not, would it be possible to modify >> the split method to produce that result? >> >> I'm running Ruby 1.8.6 on Windows. > > Hm, you could do it with lookbehind on 1.9. On 1.8 you only have > lookforward which gives you this: > > irb(main):002:0> "a. b.".split /(?=\.\s+)/ > => ["a", ". b."] > > Not quite what you wanted. :-) We can turn look-ahead into into look-behind, though it's not pretty: $ ruby -ve 'p "This is a sentence. This is a sentence! This is a sentence?".reverse.split(/(?=(?:\A|\s+)[.!?])/).map { |s| s.reverse }.reverse' ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.1.0] ["This is a sentence. ", "This is a sentence! ", "This is a sentence?"] James Edward Gray II