如何使用JavaScript Regex提取字符串?


133

我正在尝试使用JavaScript Regex从文件中提取子字符串。这是文件的一部分:

DATE:20091201T220000
SUMMARY:Dad's birthday

我要提取的字段是“摘要”。这是方法:

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

Answers:


88

您需要使用m 标志

多行 将开头和结尾字符(^和$)视为在多行上工作(即,匹配每行的开头或结尾(以\ n或\ r分隔),而不仅仅是整个输入字符串的开头或结尾)

还要将放在*正确的位置:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|

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

您需要进行以下更改:

  • *按照上面的建议在圆括号内放上。否则,您的匹配组将仅包含一个字符。

  • 摆脱^$。使用global选项时,它们在完整字符串的开始和结尾匹配,而不是在行的开始和结尾匹配。而是在明确的换行符上进行匹配。

  • 我想您想要匹配的组(括号内是什么)而不是整个数组?arr[0]是完全匹配("\nSUMMARY:..."),下一个索引包含组匹配。

  • String.match(regexp)应该返回一个带有匹配项的数组。在我的浏览器中,它没有(Mac上的Safari仅返回完全匹配项,而不返回组),但是Regexp.exec(string)可以工作。


1
我将其与@barkmadley结合使用,|| [null, null]因为如果匹配失败,则为arrnull并arr[1]抛出异常
Kunal

22

您的正则表达式很可能希望成为

/\nSUMMARY:(.*)$/g

我喜欢使用的一个有用的小技巧是在与数组匹配时默认分配。

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

这样,您在使用时就不会遇到烦人的类型错误 arr


2
match如果没有匹配项
Kunal

7

(.*)而不是(.)*一个开始。后者将仅捕获行中的最后一个字符。

此外,也无需逃脱:


-1

这是您可以使用javascript解析iCal文件的方法

    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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.