views:

235

answers:

5

Hi all,

it might look obvious but I wasted too much time trying to get it to work...

I'm trying to extract a substring from a file with Javascript Regex. Here is a slice from the file :

DATE:20091201T220000
SUMMARY:Dad's birthday

the field I want to extract is Summary, so I'm trying to write a method that returns only the summary text. Here is the method :

extractSummary : function(iCalContent) {
  /*
  input : iCal file content
  return : Event summary
  */
  var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
  return(arr);
}

clearly, I'm a Regex noob :)) could you fix it please ? thanks

+2  A: 

(.*) instead of (.)* would be a start. The latter will only capture the last character on the line.

Also, no need to escape the :.

Tim Pietzcker
+2  A: 
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

You need these changes:

  • Put the * inside the parenthesis as suggested above. Otherwise your matching group will contain only one character.

  • Get rid of the ^ and $. With the global option they match on start and end of the full string, rather than on start and end of lines. Match on explicit newlines instead.

  • I suppose you want the matching group (what's inside the parenthesis) rather than the full array? arr[0] is the full match ("\nSUMMARY:...") and the next indexes contain the group matches.

  • String.match(regexp) is supposed to return an array with the matches. In my browser it doesn't (Safari on Mac returns only the full match, not the groups), but Regexp.exec(string) works.

j-g-faustus
tried it but doen'st work.
Med
A: 

Your regular expression most likely wants to be

/\nSUMMARY:(.*)$/g

A helpful little trick I like to use is to default assign on match with an array.

var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];

This way you don't get annoying type errors when you go to use arr

barkmadley
A: 

this is how you can parse iCal files with javascript

 function calParse(str) {

  function parse() {
   var obj = {};
   while(str.length) {
    var p = str.shift().split(":");
    var k = p.shift(), p = p.join();
    switch(k) {
     case "BEGIN":
      obj[p] = parse();
      break;
     case "END":
      return obj;
     default:
      obj[k] = p;
    }
   }
   return obj;
  }
  str = str.replace(/\n /g, " ").split("\n");
  return parse().VCALENDAR;
 }

 example = 
 'BEGIN:VCALENDAR\n'+
 'VERSION:2.0\n'+
 'PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n'+
 'BEGIN:VEVENT\n'+
 'DTSTART:19970714T170000Z\n'+
 'DTEND:19970715T035959Z\n'+
 'SUMMARY:Bastille Day Party\n'+
 'END:VEVENT\n'+
 'END:VCALENDAR\n'


 cal = calParse(example);
 alert(cal.VEVENT.SUMMARY);
stereofrog
+1  A: 

(1) m -- add an m flag (2) put the * in the right place

yada_yada.match( /^SUMMARY\:(.*)$/gm );
//----------------------------^    ^
//---------------------------------|

See this URL for useful details about pattern syntax.

Salman A