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

206

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

DATE:20091201T220000
SUMMARY:Dad's birthday

我想要提取的字段是"Summary"。以下是方法:

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

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

你需要进行以下更改:

  • * 放在括号里面,如上所建议。否则,匹配组将仅包含一个字符。

  • 去掉 ^$。使用全局选项时,它们会匹配完整字符串的开头和结尾,而不是行的开头和结尾。要匹配显式换行符。

  • 我猜你想要匹配组(括号中的内容),而不是整个数组?arr[0] 是整个匹配("\nSUMMARY:..."),接下来的索引包含组匹配。

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


3
如果匹配失败,arr 将为 null 并且 arr[1] 将抛出异常,因此我建议将其与 @barkmadley 的 || [null, null] 结合使用。 - Kunal

111

你需要使用m 标记:

multiline; 将起始和结束字符(^和$)视为可以跨越多行工作,即匹配每一行的开头或结尾(由\n 或 \r分隔),而不仅仅是整个输入字符串的开始或结尾。

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

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

28

你的正则表达式很可能需要是

/\nSUMMARY:(.*)$/g

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

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

这样做可以避免在使用arr时出现烦人的类型错误。


5
如果没有匹配,match会返回 null。 - Kunal
1
返回 arr[0] 将会返回输入字符串。如果你想要返回捕获组,你需要返回 arr[1]。而你的默认值 [""] 需要改为 ["",""] - BrianV

10
使用 (.*) 而非 (.)* 可以作为一个起点。后者只能捕获到行末的字符。
同时,: 不需要进行转义。

10
这段代码有效:


注:该段代码未被完整闭合,在我的答案中我尽量保留了原始标签。
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

祝你好运。


在所需字符串中出现任何禁止字母时,使用否定查找将失败。 - Aurovrata

5

你应该使用这个:

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

-2

这是如何使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接