来自 GmailMessage 类正则表达式的 Google Apps 脚本 getPlainBody() 不起作用

Posted

技术标签:

【中文标题】来自 GmailMessage 类正则表达式的 Google Apps 脚本 getPlainBody() 不起作用【英文标题】:Google Apps Script getPlainBody() from GmailMessage class regex not working 【发布时间】:2021-10-23 06:40:37 【问题描述】:

这是我关于 *** 的第一个问题,所以请告诉我如何提高其他人的可读性。

我正在尝试对我从 GmailMessage 类中的 getPlainBody() 获得的字符串使用正则表达式,但是当我尝试直接在 getPlainBody() 返回的字符串上执行此操作时它不起作用,但当我手动添加 \ 时效果很好n 个字符。

有效的代码:

function RegularExp() 
  
  //manually entered \n characters into string that I copied and pasted from getPlainBody()

  var string = "Personal Message\nraw material: oak wood 100kg\nTRACKING NUMBER 7777777777\n<somehyperlink\nFROM SomeBrand"; 

  //my goal is to get: raw material: oak wood 100kg

  var regExp = new RegExp("(.*?)\n(?=TRACKING NUMBER)","g"); 

  var PersonalMessage = regExp.exec(string)[1];
  Logger.log(PersonalMessage); //works perfectly fine


不起作用的代码:

for (var j in messages)
  var message = messages[j];
  var plainText = message.getPlainBody(); //getting plainbody of fedex mail of interest

  //trying to extract the personal message 
  var regExp = new RegExp("(.*?)\n(?=TRACKING NUMBER)","g");  
  var PersonalMessage = regExp.exec(plainText)[1];
  Logger.log(PersonalMessage); //won't show anything

我的问题是为什么当我手动输入 \n 时它会起作用,但当我使用从 getPlainBody() 返回的字符串时它不起作用?我正在使用完全相同的正则表达式模式,但不知道为什么。

以下是我用来尝试解决问题的链接(或者我可能只是愚蠢,无法将解决方案应用于此问题)

Newline in gmail app script getplainbody function

Google Apps Script: getPlainBody() weird behavior

Regex - google apps script

谢谢

【问题讨论】:

试试这个:(.*?)\\n(?=TRACKING NUMBER) @Alireza 我在有和没有 g 标志的情况下都试过了,但仍然没有工作:( 试试这些:([^\\n]+?)(?=\\nTRACKING NUMBER)([^\n]+?)(?=\nTRACKING NUMBER) 希望它对你有用。 @Alireza 什么...你是魔术师?! ..?!像魅力一样工作..我在 regexr.com 和其他网站上使用了我的第一个正则表达式代码 - 工作正常,但不知何故它在谷歌应用程序脚本中不起作用。请问你是怎么解决这个问题的?正则表达式非常有用,但绝对是一个挑战。 我会为它写一个答案和解释。 【参考方案1】:

问题在于 .javascript 正则表达式(ECMAScript 风格)中的 CR 字符不匹配。

你可以使用

var regExp = /(.*)(?=\r?\nTRACKING NUMBER)/g; 

正则表达式匹配

(.*) - 第 1 组:除换行符以外的任何零个或多个字符(与 LF 和 CR 字符不匹配) (?=\r?\nTRACKING NUMBER) - 与紧随其后的位置匹配的正向前瞻 \r? - 一个可选的 CR(回车符) \n - 换行符 TRACKING NUMBER - 一些固定的字符串(在下一行的末尾)。

【讨论】:

以上是关于来自 GmailMessage 类正则表达式的 Google Apps 脚本 getPlainBody() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

关于正则表达式的一些基础知识

正则表达式中的重复和字符类

几个方便的正则表达式

正则表达式

javascript正则表达式

正则表达式练习之贴吧实例