谷歌脚本匹配正则表达式

10
使用谷歌脚本,我正在尝试匹配一个始终看起来像这样的字符串部分: *YYYYMMDD;hhmm* 例如:*20170701;0900*
我定义了以下正则表达式:
var regExp = ('(?:\*)(?P<date>\d+)(?:\;)(?P<time>\d+)(?:\*)','gi');

然后使用以下方式调用:

var datepart = textbody.match(regExp);

然而我没有得到任何匹配,尽管在https://regex101.com/上相同的文本可以很好地工作。 你有什么想法我做错了什么吗?


1
你能展示一下原文中你实际想要匹配的内容吗? - Tim Biegeleisen
谢谢Tim。我有一个Google脚本函数,旨在输出我手动输入的日期戳,以便在以后发送消息时使用。正则表达式扫描的元素是一个字符串:var textbody = Utilities.newBlob(part.body.data).getDataAsString();该字符串包含格式为*20170710;0900*的自定义时间戳,后跟电子邮件的实际文本正文。我想提取时间戳,将其存储为变量,并用空白替换,以便发出的电子邮件不包含时间戳。 - nubie
您为 PCRE 引擎创建了一个正则表达式,然而在 Google Apps 脚本中,您应该使用适用于 JavaScript 的正则表达式。 - Wiktor Stribiżew
1个回答

12

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

删除所有命名捕获组(JS不支持它们,即(?P<date>\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];
}
请注意,(?:\*) = \*是因为非捕获组仍然是一个消耗模式(即它匹配的内容会添加到匹配值中)。由于您想要获取正则表达式的子部分,因此只需关注捕获组,即那些(...)部分。

1
谢谢,这个程序在2019年仍然像魔法一样运行良好。对于每个人,请不要忘记在regex101.com上测试时使用ECMAScript匹配等等。 - Marek Čech
我们如何将正则表达式捕获/封闭的每个元素作为2D数组的单独元素? - Luis Alberto Delgado de la Flo
要获取正则表达式匹配的部分,您需要用捕获组将这些部分括起来,即未转义的一对括号。但是,如果您使用带有全局修改器 gmatch(/regex/g),您将丢失这些捕获的子字符串。因此,您可以在循环中使用 RegExp#exec(就像 How do you access the matched groups in a JavaScript regular expression? 线程中一样),或者使用 matchAll - Wiktor Stribiżew

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