|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
[Note: parts of this message were removed to make it a legal post.]
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. Thanks for your . |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
> Does such an array exist? If not, would it be possible to modify the split method to produce that result?
If you put the pattern in a group, it will be included in the array -- but not quite in the way you described: irb(main):001:0> 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", "?"] Regards, Thomas. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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. :-) But here's an alternative approach which works with 1.8: irb(main):005:0> "a. b. c! d? e.".scan /.*?[.!?](?:\s|$)/ => ["a. ", "b. ", "c! ", "d? ", "e."] Kind regards robert -- use.inject do |as, often| as.you_can - without end |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 |
|
![]() |
| Outils de la discussion | |
|
|