【问题标题】:My Google Apps script regex requires a match for either one expression or another.我的 Google Apps 脚本正则表达式需要匹配一个或另一个表达式。
【发布时间】:2018-07-04 08:46:47
【问题描述】:

被匹配的文本要么是“问题”,要么是带有随附文本的“请求”。例如

问题:检查所有锅炉

请求:维修给水泵锅炉 5

如果我使用 javascript 在线正则表达式测试实用程序测试我的表达式,它会按预期工作,但是我的应用程序脚本会失败,因为只测试第一个表达式并且总是忽略备用捕获组。

tmp = content.match(/Request\s{0,3}:\s{0,3}([A-Za-z0-9.,'&\s]+)(\r?\n)|Issue\s{0,3}:\s{0,3}([A-Za-z0-9.,'&\s]+)(\r?\n)/);

【问题讨论】:

  • 试试.match(/\b(?:Issue|Request)\s*:\s*(.+)/)[1]
  • 是的!谢谢 Wiktor,最简单的总是最好的。
  • 我不知道为什么这个贪婪的表达方式不仅在问题或请求之后捕获了我文档中的所有文本,而且还在起作用。
  • 这是因为. 匹配任何字符除了换行符

标签: regex google-apps-script


【解决方案1】:

你可以使用

var s = "Issue: Inspection on all Boilers\n\nRequest: Repair Feed water pump Boiler 5";
var match = s.match(/\b(?:Issue|Request)\s*:\s*(.+)/); // Get a match
if (match) {                                           // Check if there is a match first
  console.log(match[1]);
}

模式匹配

  • \b - 一个词的边界
  • (?:Issue|Request) - IssueRequest 作为整个词
  • \s*:\s* - : 包含 0+ 个空格
  • (.+) - 捕获组 1:除换行符之外的任何一个或多个字符。

我们首先使用String#match方法得到一个匹配,然后检查是否与if (match)匹配(或者,如果没有匹配,尝试访问match[1]时会弹出错误),然后访问使用match[1] 的第一个也是唯一一个捕获组的内容。

【讨论】:

  • 好的,Wiktor 感谢您的清晰解释,您促使我更彻底地研究正则表达式语法。
猜你喜欢
  • 2010-09-23
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多