如何使用Javascript Regex提取字符串

Pap*_*cel 124 javascript regex string icalendar

它可能看起来很明显,但我浪费了太多时间试图让它工作......

我正在尝试使用Javascript Regex从文件中提取子字符串.这是文件中的一个切片:

DATE:20091201T220000
SUMMARY:Dad's birthday
Run Code Online (Sandbox Code Playgroud)

我要提取的字段是摘要,所以我正在尝试编写一个只返回摘要文本的方法.这是方法:

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

显然,我是一个正则表达式noob :))你能解决它吗?谢谢

j-g*_*tus 92

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

您需要这些更改:

  • *括号内为上述建议.否则,您的匹配组将只包含一个字符.

  • 摆脱^$.使用全局选项,它们在完整字符串的开头和结尾匹配,而不是在行的开头和结尾.匹配显式换行符.

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

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

  • 我会将它与 @barkmadley 的 `|| 结合起来 [null, null]` 因为如果匹配失败,`arr` 将为 null 并且 `arr[1]` 会抛出异常 (2认同)

Sal*_*n A 85

你需要使用m 标志:

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

也放在*正确的地方:

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


bar*_*ley 18

你的正则表达式最有可能成为

/\nSUMMARY:(.*)$/g
Run Code Online (Sandbox Code Playgroud)

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

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

这样,当您使用时,您不会遇到恼人的类型错误 arr

  • 如果没有_match_,则match会返回null (2认同)

小智 10

这段代码的工作原理:

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

res 将等于“string_i_want”。但是,在此示例中,res 仍然是一个数组,因此不要将 res 视为字符串。

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

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

祝你好运。


Tim*_*ker 6

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

而且,没有必要逃避:.


Mou*_*ami 5

你应该使用这个:

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