如何使用JavaScript正则表达式提取字符串?

如何使用JavaScript正则表达式提取字符串?,javascript,regex,string,icalendar,Javascript,Regex,String,Icalendar,我试图用JavaScript正则表达式从文件中提取一个子字符串。以下是文件中的一个片段: DATE:20091201T220000 SUMMARY:Dad's birthday 我要提取的字段是“摘要”。方法如下: extractSummary : function(iCalContent) { /* input : iCal file content return : Event summary */ var arr = iCalContent.match(/^SUMMA

我试图用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);
}
(.*)
而不是
(.)*
将是一个开始。后者将只捕获行中的最后一个字符

此外,无需转义

function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}
您需要以下更改:

  • *
    放在括号内,如下所示 以上建议。否则你的匹配 组将只包含一个 性格

  • 摆脱
    ^
    $
    。使用全局选项,它们在整个字符串的开始和结束处匹配,而不是在行的开始和结束处匹配。而是在显式换行符上进行匹配

  • 我想你想要匹配的组(什么是 括号内)而不是 完整阵列<代码>arr[0]is 完全匹配(
    “\n摘要:…”
    )和 下一个索引包含该组 火柴

  • String.match(regexp)是 应该返回一个带有 比赛。在我的浏览器中没有(Mac上的Safari只返回完整的 匹配,而不是分组),但 Regexp.exec(字符串)可以工作


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

      /\nSUMMARY:(.*)$/g
      
      我喜欢使用的一个有用的小技巧是在匹配数组时默认赋值

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

      这样,当您使用
      arr

      时,就不会出现恼人的类型错误。这就是使用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);
      

      您需要使用
      m

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

      同时将
      *
      放在正确的位置:

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

        let str = "governance[string_i_want]"; 
        let res = str.match(/[^governance\[](.*)[^\]]/g);
      
      res将等于“string_i_want”。但是,在本例中,res仍然是一个数组,因此不要将res视为字符串

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

      您可以在这里尝试:

      祝你好运。

      你应该用这个:

      var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
      return(arr[0]);
      

      match
      在没有匹配的情况下返回空值,我会将其与@barkmadley的
      | |[null,null]
      相结合,因为如果匹配失败,
      arr
      将为空,
      arr[1]
      将引发异常