Regex正在regex101.com上工作,但不是谷歌脚本

时间:2017-10-29 15:16:30

标签: regex google-apps-script

问题:

大家好,这是我的第一个问题,我很欣赏这个社区在帮助大家方面做得多么好!

我遇到与this thread类似的问题 - 我的正则表达式就像regex101中的魅力一样,但在谷歌脚本中返回null。

我试图在许多项目上返回下一行:

  • 确认码
  • 入住
  • Checout
  • 赔付
  • 访客人数
  • 赔付

以下是我要搜索的数据:

新预订已确认!
杰克于10月22日抵达

发送消息确认入住详情或欢迎杰克。

杰克弗莱克 凤凰城,加利福尼亚,美国 Airbnb会员自2015年起

向Jake发送消息: https://www.airbnb.com/z/q/;laskdf;lksjdf

逍遥游 https://www.airbnb.com/manage-listing/asdflkjsdf;lkajsfd

旅行详情 报到 太阳,10月22日 下午4点后的任何时间

结帐 10月26日星期四 上午11时

客人 13

确认码 H7XS0SA8 查看行程 https://www.airbnb.com/reservation/itinerary?code=aasdfasdf

付款 $ 275.50 x 4晚 $ 1102.00 清洁费 $ 180.00 客人付费 $ 1282.00 Airbnb费用 - $ 38.46 你赚了 $ 1243.54 在您的客人办理入住手续后的第二天,您提供的付款方式将被记入贷方。有关详情,请参阅您的交易记录。 您的客人支付了161.15美元的入住税。 Airbnb代表您支付这些税款。

----------------------------------------------- -------------------------

为杰克的到来做好准备 提供方向 确认您的客人知道如何到达您的位置。 整理 清理所有共享空间。确保您的客人有干净的床单和毛巾。

客户支持

访问帮助中心 https://www.airbnb.com/help?eal_exp=asdfasdf

联系Airbnb https://www.airbnb.com/help/contact_us?eal_exp=asdfasdf

谢谢, Airbnb团队

电子邮件偏好设置 https://www.airbnb.com/users/notifications?eal_exp=asdfasdf

的Airbnb

我的代码有效:

function getNumberofGuests(message_body) {
  var num_guests = message_body.match("Guests[\r\n]+([^\r\n]+)")[1];
  Logger.log("num_guests: " + num_guests);

  return num_guests;
}

日志 - num_guests:13

类似的Senario中的相同代码不起作用:

function getReservationID(message_body) {
var reservationID = message_body.match("Confirmation\scode[\r\n][^\r\n]+")[1];
  Logger.log("reservationID: " + reservationID);

  return reservationID;

日志 - reservationID:null

这让我发疯,因为我花了15个小时研究答案,但我仍然无法弄清楚。

PS

由于某些原因,此显示中的正文格式已关闭,我尝试了30分钟,但仍然无法解决问题。在message_body中,它应该是" Check-in"," Checkout"," Guests"," Confirmation code"之后的新行。等等 - 当前显示空格的每个元素后面都有一个新行。

我也试过空间字符正则表达式,但仍然是null:

 var regExp = new RegExp("Confirmation\scode[\s]^[^\s]+", 'g')

感谢Stack Overflow社区,我很乐意并感谢您对此的任何帮助! -Blaine

2 个答案:

答案 0 :(得分:0)

我将数据加载到文件中,然后在以下代码中将文件加载到变量dt中:

function getMyData() 
{
   var ss=SpreadsheetApp.getActive();
   var sh=ss.getActiveSheet()
   var dt=myUtilities.loadFile('regex.txt');
   var guests = dt.match(/^Guests (\d+)/m)[1];
   var cf=dt.match(/^Confirmation code ([0-9A-Z]+)/m)[1];
  var ui=HtmlService.createHtmlOutput(dt).append(Utilities.formatString('<br /><strong>Matches:</strong><br />Guests=%s<br />Confirmation Code=%s',guests,cf));
   SpreadsheetApp.getUi().showModelessDialog(ui, 'Input Data & Extracted Parameters');

}

在使用正则表达式一段时间后,我得到了这个包含数据副本的输出:

enter image description here

  

m标志用于多行。

我第一次错过了一些数据。

  

以下是包含一些其他参数的新代码:

function getMyData() 
{
   var ss=SpreadsheetApp.getActive();
   var sh=ss.getActiveSheet()
   var dt=myUtilities.loadFile('regex.txt');
   var guests = dt.match(/^Guests (\d+)/m)[1];
   var cf=dt.match(/^Confirmation code ([0-9A-Z]+)/m)[1];
   var chout=dt.match(/^Checkout (.*)$/m)[1];
   var chin=dt.match(/^Trip details (.*)$/m)[1];
   var payout=dt.match(/Guest Pays ([$.0-9]+)/m)[1];
  var ui=HtmlService.createHtmlOutput(dt).append(Utilities.formatString('<br /><strong>Matches:</strong><br />Guests=%s<br />Confirmation Code=%s<br />Checkout=%s<br />Checkin=%s<br />Payout=%s',guests,cf,chout,chin,payout)).setWidth(1200);
   SpreadsheetApp.getUi().showModelessDialog(ui, 'Input Data and Extracted Parameters');
}

这是输出:

enter image description here

我猜你可以弄清楚如何自己完成剩下的工作。我希望这会有所帮助。

答案 1 :(得分:0)

在查看代码并尝试之后,由于您在匹配方法中所做的更改,您将获得null。 num_guests工作的原因是因为它的设置方式是查找单词“Guests”,下一行是数组的结果(注意行末尾的[1])。同样的概念/正则表达式也适用于确认代码部分,但是你输入“\ s”并改变了一些括号的顺序。由于搜索代码是双引号,因此您不需要“\ s”。基本上,当您需要“确认代码”时,您有“确认\ scode”。虽然它适用于regex101,但尝试使用Google Apps脚本环境会产生实际效果。