如何使用JavaScript正则表达式提取字符串?
我试图用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
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]
将引发异常