首页 > 解决方案 > Google Script,如何在我的正则表达式搜索字数限制中包含带撇号的字词?

问题描述

这里非常缺乏经验的编码器,我最近得到了一个脚本,它使用正则表达式来搜索在特定字数限制内出现的两个不同的单词。所以我可以搜索出现在 10 个单词内的“the”和“account”,然后我的脚本会打印它出现的句子。但是,我最近发现如果“the”和“account”之间的任何单词包含撇号,我的代码无法找到这种情况。例如,如果我想找到一个包含“the”和“account”的句子,例如:“I am here to check why the money is not in my account”那么我的脚本将无法工作,因为撇号词, “不是”,介于我的搜索词“the”和“account”之间。如果这还不够清楚,请不要 犹豫不决评论和询问。这是我的脚本:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var historySheet = ss.getSheetByName('master');  
var resultsSheet = ss.getSheetByName('results');
var totalRowsWithData = historySheet.getDataRange().getNumRows();
var data = historySheet.getRange(1, 1, totalRowsWithData, 3).getValues(); 
var regexp = /\W*(the)\W*\s+(\w+\s+){0,10}(account)|(account)\s+(\w+\s+){0,10}(the)/i;
var result = []; 
for (var i = 0; i < data.length; i += 1) {
     var row = data[i];
     var column = row[0];
     if (regexp.exec(column) !== null) {
        result.push(row); }}
if (result.length > 0) {
    var resultsSheetDataRows = resultsSheet.getDataRange().getNumRows();
    resultsSheetDataRows = resultsSheetDataRows === 1 ? resultsSheetDataRows : resultsSheetDataRows + 1; 
    var resultsSheetRange = resultsSheet.getRange(resultsSheetDataRows, 1, result.length, 3);
  resultsSheetRange.setValues(result);}}

标签: javascriptgoogle-apps-script

解决方案


鉴于您的示例,罗杰的回答将不起作用,因为两个单词之间的字母也超过 10 个字符。将 Roger 的示例更改为:

/\W*(the)\W*\s+([\w']+\s+){0,15}(account)|(account)\s+([\w']+\s+){0,15}(the)/i 将工作。

一种有助于稍微控制返回的变体,提取您的示例字符串并为中间的单词提供更多可能性。我将字母计数增加到 25 并将其更改为允许任何字符,并?在末尾添加量词以捕获出现的 0 或 1,这可能有助于消除误报,让您的正则表达式在其他匹配项中找到匹配项:

/(the.{0,25}?account)|(account.{0,25}?the)/gim

您目前周围有捕获组theaccount鉴于您提供的示例,我认为这不是您想要的。在上面的示例中,我将捕获组放在整个短语周围,因为这就是您要捕获的内容。

根据字符串在电子表格中的方式,变化可能是:

/(the.*?account)|(account.*?the)/gi

这不会限制模式中的字母数量,并且通过将量词添加?到末尾将不允许它跨越匹配的组。

最后,\W*开头的 可能会导致一些问题,在我更简单的示例中,我添加了“多行”标志以允许您使用的字符串中是否存在换行符。


推荐阅读