174

我正在尝试使用 JavaScript 正则表达式从文件中提取子字符串。这是文件中的一个片段:

DATE:20091201T220000
SUMMARY:Dad's birthday

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

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

7 回答 7

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

您需要这些更改:

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

  • 摆脱^and $。使用 global 选项,它们匹配整个字符串的开头和结尾,而不是行的开头和结尾。改为匹配显式换行符。

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

  • String.match(regexp) 应该返回一个匹配的数组。在我的浏览器中它没有(Mac 上的 Safari 只返回完整匹配,而不是组),但 Regexp.exec(string) 有效。

于 2009-11-10T12:34:01.823 回答
107

您需要使用m 标志

多行;将开始和结束字符(^ 和 $)视为处理多行(即,匹配每行的开始或结束(由 \n 或 \r 分隔),而不仅仅是整个输入字符串的开始或结束)

也把它*放在正确的地方:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
于 2009-11-10T13:18:11.430 回答
26

您的正则表达式很可能想要成为

/\nSUMMARY:(.*)$/g

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

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

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

于 2009-11-10T12:36:51.067 回答
9

(.*)而不是(.)*一个开始。后者只会捕获该行的最后一个字符。

此外,无需逃避:.

于 2009-11-10T11:32:18.100 回答
6

此代码有效:

let str = "governance[string_i_want]"; 
let res = str.match(/[^governance\[](.*)[^\]]/g);
console.log(res);

res 将等于“string_i_want”。但是,在这个例子中 res 仍然是一个数组,所以不要把 res 当作一个字符串。

通过对我不想要的字符进行分组,使用 [^string],并匹配括号之间的内容,代码提取了我想要的字符串!

你可以在这里试试:https ://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_match_regexp

祝你好运。

于 2020-12-02T12:52:47.277 回答
3

你应该使用这个:

var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
return(arr[0]);
于 2021-05-17T20:21:32.167 回答
-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);
于 2009-11-10T13:04:49.007 回答