【问题标题】:Google Scripts match regex谷歌脚本匹配正则表达式
【发布时间】:2017-12-21 02:39:10
【问题描述】:

使用谷歌脚本我试图匹配一个总是看​​起来像这样的字符串部分: *YYYYMMDD;hhmm* 例如:*20170701;0900*

我定义了这个正则表达式:

var regExp = ('(?:\*)(?P<date>\d+)(?:\;)(?P<time>\d+)(?:\*)','gi');

然后调用它:

var datepart = textbody.match(regExp);

但是我没有得到任何匹配,尽管https://regex101.com/ 中的相同文本效果很好。知道我做错了什么吗?

【问题讨论】:

  • 您能否向我们展示您在原始上下文中实际尝试匹配的内容?
  • 谢谢蒂姆。我有一个谷歌脚本功能,旨在输出我在起草稍后发送的消息时手动输入的日期戳。正则表达式正在扫描的元素是一个字符串: var textbody = Utilities.newBlob(part.body.data).getDataAsString();该字符串包含格式为 *20170710;0900* 的自定义时间戳,后跟电子邮件的实际文本正文。我想提取时间戳,将其存储为变量,并替换为空白,以便发出的电子邮件不包含时间戳。
  • 您为 PCRE 引擎创建了一个正则表达式,而在 Google Apps 脚本中,您应该为 JavaScript 使用一个

标签: javascript regex gmail-api


【解决方案1】:

您为 PCRE 引擎创建了一个正则表达式,而在 Google Apps 脚本中,您应该为 JavaScript 使用一个。

删除所有命名的捕获组(JS不支持它们,即(?P&lt;date&gt;\d+) => (\d+)),使用正则表达式文字(即RegExp("pattern", "gi") => /pattern/gi,但这里不需要i , 仅当模式中有字母时才使用它),删除全局修饰符以与 捕获组保持匹配。

var rx = /\*(\d+);(\d+)\*/;
var datepart = textbody.match(rx); 
var date, time;
if (datepart) {
    date = datepart[1];
    time = datepart[2];
}

请注意 (?:\*) = \* 因为非捕获组仍然是一个消耗模式(即它匹配的内容被添加到匹配值中)。由于您想要获取正则表达式的子部分,您只需关注捕获组,即 (...) 部分。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2013-04-14
  • 2016-08-21
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多