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

link|improve this question

45% accept rate
feedback

5 Answers

up vote 1 down vote accepted

(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.

link|improve this answer
feedback

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

Also, no need to escape the :.

link|improve this answer
feedback
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.

link|improve this answer
tried it but doen'st work. – Med Nov 10 '09 at 15:17
feedback

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

link|improve this answer
feedback

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);
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.