【问题标题】:Having regex issue across multiple lines跨多行存在正则表达式问题
【发布时间】:2020-12-25 21:18:18
【问题描述】:

我正在使用 Google Apps 脚本查找订单确认电子邮件(例如来自 Amazon 和 Target)并提取订单的总价。

来自目标的电子邮件包含多个美元值(单个项目、税金和总计)。我想我可以通过查找“total”这个词来确定总价,然后得到下一个 $ 值。

这是电子邮件正文的摘录。

                   <table  cellspacing=3D"0" cellpadding=3D"0" border=3D"0=
">
                        <tbody>
                                <tr>
                                    <td>
                                      <span style=3D"font-family:Arial, Hel=
vetica, sans-serif;font-size:18px;color:#231f20;font-weight:bold;">total:</=
span>
                                    </td>                                  =
=20
                                </tr>
                            </tbody>
                        </table>
                    </td>
                    <td align=3D"right">
                    <table  cellspacing=3D"0" cellpadding=3D"0" border=3D"0=
">
                        <tbody>
                                <tr>
                                    <td>
                                      <span style=3D"font-family:Arial, Hel=
vetica, sans-serif;font-size:18px;font-weight:bold;color:#231f20">$26.49</s=
pan>
                                    </td>                                  =
=20
                                </tr>
                            </tbody>
                        </table>
                   =20
</td>
                </tr>
                <tr>

这是我构建和测试的正则表达式

/total:(?:.*\n)*.*\$\d+\.\d{2}/

它适用于文本网站,例如https://regexr.com/

但是,在我的脚本中它不起作用。使用调试器,我可以看到我的变量永远不会被匹配填充。但是,如果我将正则表达式简化为

,它确实有效
/total:/

这是我的代码:

function testGmail() {
  var threads = GmailApp.getInboxThreads();
  var messages = GmailApp.getMessagesForThreads(threads)
  
  for (var i = 0 ; i < threads.length; i++) {
    var from = messages[i][0].getFrom()
    switch(from) {
      case "\"Amazon.com\" <no-reply@amazon.com>":
        Logger.log("From is Amazon")
        break
        
      case "\"Target.com\" <orders@service.target.com>":
        Logger.log("From is Target")
        
        var body = messages[i][0].getRawContent()
        var amount = parseMessageData(body)
        Logger.log(amount)
        
        break
        
        default:
        Logger.log("From is " + from)
    }
    
  }
}

function parseMessageData(body) {
  
  // Look for the price
  var regExAmount = /total:/
  var amountmatch = body.match(regExAmount)
  var amount = amountmatch[0].replace(/[^\d.]/g, '') // only keeps digits and periods (.) (to remove $ sign and any commas)
  
  return amount
}

【问题讨论】:

    标签: javascript html regex google-apps-script


    【解决方案1】:

    我选择了这个:

    /total:[\s\S]*?\$(\d+\.\d{2})/
    

    谢谢。

    【讨论】:

      【解决方案2】:

      由于您的 * 量词是 贪婪

      总金额在以下的第 1 组中捕获:

      [Tt]otal[\s\S]*?\$([\d.]+)
      

      live demo

      诀窍是使用[\s\S] 匹配包括换行符在内的任何内容,并在* 之后添加? 以使量词不情愿 - 停在下一个 “ $”。

      【讨论】:

      • 似乎 (?i) 不适用于 Javascript 正则表达式,这可能是 Google Apps 脚本使用的...我将尝试剖析您提供的内容,看看我是否可以创建一些东西类似。
      • @matt 然后删除(?i)。它使匹配不区分大小写,但还有其他方法:请参阅编辑后的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多