# Parsing strings

**URL:** <https://www.ruby-forum.com/t/parsing-strings/186766>\
**Category:** Rails\
**Created:** [February 25, 2008, 9:57pm UTC](https://www.ruby-forum.com/t/parsing-strings/186766 "2008-02-25T21:57:26Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 25, 2008, 9:57pm UTC](https://www.ruby-forum.com/t/parsing-strings/186766/1 "2008-02-25T21:57:26Z")

</div>

I’m trying to parse ical strings (not that ical strings are all that  
special) but I’m trying to break them down for date calculations…

so if I have a value like this…

@events[0].recurrence\_rules  
=\> [“FREQ=YEARLY;INTERVAL=1;UNTIL=99991231”]

this seems so damn clumsy…

freq = “yearly” if @events[0].recurrence\_rules.to\_s =~ /FREQ=YEARLY/  
freq = “monthly” if @events[0].recurrence\_rules.to\_s =~ /FREQ=MONTHLY/

and then the interval, I would really just like the numerical value…

how can I cleanly get these values because reg expressions seem so  
clumsy

Craig

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 26, 2008, 3:33am UTC](https://www.ruby-forum.com/t/parsing-strings/186766/2 "2008-02-26T03:33:31Z")

</div>

Hi Craig,

The following regex will produce a hash for you with key/value pairs  
as defined in that rules string you provided:-

recurrence\_rules = “FREQ=YEARLY;INTERVAL=1;UNTIL=99991231”.downcase  
Hash[_recurrence\_rules.scan(/([^=;][a-z1-9]_)/).zip.flatten]

Beneath is my irb output so you can see how i thought you could use  
it:-

> > recurrence\_rules = “FREQ=YEARLY;INTERVAL=1;UNTIL=99991231”.downcase  
> > =\> “freq=yearly;interval=1;until=99991231”

> > ical = Hash[_recurrence\_rules.scan(/([^=;][a-z1-9]_)/).zip.flatten]  
> > =\> {“freq”=\>“yearly”, “until”=\>“99991231”, “interval”=\>“1”}

> > ical.each\_key {|key| puts “#{key}=\>#{ical[key]}”}  
> > freq=\>yearly  
> > until=\>99991231  
> > interval=\>1  
> > =\> {“freq”=\>“yearly”, “until”=\>“99991231”, “interval”=\>“1”}

Hope that is ok?

Regards,  
Jabbslad

---

<div class="post-metadata">

**Author:** ![craigrails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/c2a13f/32.png) [@craigrails](https://www.ruby-forum.com/u/craigrails)\
**Post date:** [February 26, 2008, 10:46pm UTC](https://www.ruby-forum.com/t/parsing-strings/186766/3 "2008-02-26T22:46:55Z")

</div>

On Mon, 2008-02-25 at 18:33 -0800, Jabbslad wrote:

> Beneath is my irb output so you can see how i thought you could use  
> until=\>99991231  
> interval=\>1  
> =\> {“freq”=\>“yearly”, “until”=\>“99991231”, “interval”=\>“1”}
> 
> Hope that is ok?

* * *

thanks - what I ended up doing (and it turns out to be a little simpler)  
is this…

y = @events[x].recurrence\_rules.to\_s.split(’;’)

which gives me an array with 3 elements…

freq = y[0].gsub(/FREQ=/,’’)  
interv = y[1].gsub(/INTERVAL=/,’’).to\_i  
dends = y[2].to\_date

Thanks

Craig
