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

share|improve this question

5 Answers

up vote 2 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.

share|improve this answer

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

Also, no need to escape the :.

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

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

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

share|improve this answer

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

Your Answer

 
or
required, but never shown
discard

By posting your answer, you agree to the privacy policy and terms of service.

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