【问题标题】:Regex - Extract a substring of an email document with a regular expressionRegex - 使用正则表达式提取电子邮件文档的子字符串
【发布时间】:2018-02-19 16:05:31
【问题描述】:

我正在尝试使用正则表达式提取电子邮件文档的子字符串。我正在在线测试正则表达式,它运行良好:

online regex tester

我有一个功能可以检查 Google Apps 脚本上的正则表达式,但相同的正则表达式在这里不起作用。

var regex = new RegExp("Intrusion signature\(s\)\:\n\n(.*)");
var e = regex.exec(data);

Google Apps Script code

Logger

有谁知道为什么不工作?

【问题讨论】:

  • 可能是因为\n\n 没有真正捕捉到您的表情和您要提取的文本之间存在的所有间距。尝试改用\s+
  • 另外,当您实例化 RegExp 对象时,必须转义反斜杠:var regex = new RegExp("Intrusion signature\\(s\\)\\:\\n\\n(.*)");
  • 我已将正则表达式更改为 Intrusion signature(s)\:\s+(.*) 但仍然无法正常工作...我认为 Google Apps 脚本不接受这种格式 :(

标签: javascript regex google-apps-script


【解决方案1】:

使用文字正则表达式而不是将字符串转换为正则表达式。

var regex = new RegExp(/Intrusion signature\(s\)\:\n\n(.*)/);

【讨论】:

  • 我为这个问题苦苦挣扎了一个小时,不明白为什么我的 exec() 返回 null,啊,GAS 文档没有帮助!非常感谢!
  • @James D Nice,但是您是如何获得所有变量/对象的概述的?在屏幕截图中。它看起来很方便...比使用 `Logger.log ` 更容易
  • @kris 是 Rhyno 脚本引擎中的调试器,你可以通过插入断点来获取它。由于升级到 V8,这更加困难,并且无法正确破坏 issue has already been reported
【解决方案2】:

当您在 RegExp 中使用常规字符串时,您需要转义每个反斜杠。 以下是您可以使用的一些替代方案。 要考虑的另一个方面是,如果您的电子表格中有 CR+LF。在这种情况下,您需要更改代码以包含 \r 我添加了一些 google API 模拟代码,以便代码 sn-p 可以在这里运行

// -----------------  Ignore this (Mock)
Logger=console;
class _SpreadsheetApp { getActiveSpreadsheet() {  class SpreadSheet {    getSheetByName(name) {
 class Sheet { getRange() { class Range { getValue() {
            return "  * Intrusion signature(s):\r\n\r\n      - This is the text I want to extract.\r\n\r\n * SI communication:\r\n";
} } return new Range(); } } return new Sheet(); } } return new SpreadSheet(); } }
var SpreadsheetApp=new _SpreadsheetApp();
// ----------------- Ignore this (Mock)

function checkRegExp() {
  var data=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("LOG").getRange("C213").getValue();
  var regex = new RegExp("Intrusion signature\(s\)\:\n\n(.*)");  // ORIGINAL
  var e = regex.exec(data);
  Logger.log("Original:"+e);

  var sol1 = new RegExp("Intrusion signature\\(s\\)\\:\\r\\n\\r\\n(.*)");
  e = sol1.exec(data); 
  if (e) Logger.log("Solution 1:"+e[1]);

  var sol2 = new RegExp("Intrusion signature\\(s\\)\\:\\W{2,4}(.*)");
  e = sol2.exec(data); 
  if (e) Logger.log("Solution 2:"+e[1]);

  var sol3 = new RegExp("Intrusion signature\\(s\\)\\:(?:\\x0d\\x0a)+(.*)");
  e = sol3.exec(data); 
  if (e) Logger.log("Solution 3:"+e[1]);

  var sol4 =   new RegExp(/Intrusion signature\(s\)\:\r\n\r\n(.*)/);
  e = sol4.exec(data); 
  if (e) Logger.log("Solution 4:"+e[1]);
  
}

checkRegExp()

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 2011-07-01
    • 2011-01-16
    • 2011-08-20
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多