Javascript 谷歌脚本,我如何在我的正则表达式搜索的字数限制中包含带撇号的单词?

Javascript 谷歌脚本,我如何在我的正则表达式搜索的字数限制中包含带撇号的单词?,javascript,google-apps-script,Javascript,Google Apps Script,这里的程序员相当缺乏经验,我最近得到了一个脚本,它使用正则表达式搜索出现在某个单词限制内的两个不同单词。所以我可以搜索10个单词以内的“the”和“account”,然后我的脚本打印出它出现的句子。然而,我最近发现,如果“the”和“account”之间的任何单词包含撇号,我的代码就无法找到这种情况。例如,如果我想找到一个包含“the”和“account”的句子,比如:“我来这里是为了检查为什么钱不在我的帐户中”,那么我的脚本就不起作用,因为在我的搜索词“the”和“account”之间有一个撇

这里的程序员相当缺乏经验,我最近得到了一个脚本,它使用正则表达式搜索出现在某个单词限制内的两个不同单词。所以我可以搜索10个单词以内的“the”和“account”,然后我的脚本打印出它出现的句子。然而,我最近发现,如果“the”和“account”之间的任何单词包含撇号,我的代码就无法找到这种情况。例如,如果我想找到一个包含“the”和“account”的句子,比如:“我来这里是为了检查为什么钱不在我的帐户中”,那么我的脚本就不起作用,因为在我的搜索词“the”和“account”之间有一个撇号“is not”。如果这还不够清楚,请毫不犹豫地发表评论并询问。 这是我的剧本:

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);}}
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结果=[];
对于(变量i=0;i0){
var resultsSheetDataRows=resultsSheet.getDataRange().getNumRows();
resultsSheetDataRows=resultsSheetDataRows==1?resultsSheetDataRows:resultsSheetDataRows+1;
var resultsSheetRange=resultsSheet.getRange(resultsSheetDataRows,1,result.length,3);
resultsSheetRange.setValues(结果);}
尝试将
(\w+\s+)
更改为
([\w']+\s+)

也就是说,整个正则表达式应该如下所示:

/\W*(the)\W*\s+([\w']+\s+){0,10}(account)|(account)\s+([\w']+\s+){0,10}(the)/i
尝试将
(\w+\s+
更改为
([\w']+\s+

也就是说,整个正则表达式应该如下所示:

/\W*(the)\W*\s+([\w']+\s+){0,10}(account)|(account)\s+([\w']+\s+){0,10}(the)/i

举个例子,罗杰的回答不起作用,因为两个单词之间的字母也超过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
目前,您在
帐户周围有捕获组,根据您提供的示例,我认为这不是您想要的。在我上面的例子中,我将捕获组放在整个短语的周围,因为这就是您打算捕获的内容

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

/(the.*?account)|(account.*?the)/gi
这不会限制模式中的字母数量,并且在末尾添加量词
不会允许它在匹配的组中延伸


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

罗杰的答案在您的示例中不起作用,因为两个单词之间的字母也超过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
目前,您在
帐户周围有捕获组,根据您提供的示例,我认为这不是您想要的。在我上面的例子中,我将捕获组放在整个短语的周围,因为这就是您打算捕获的内容

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

/(the.*?account)|(account.*?the)/gi
这不会限制模式中的字母数量,并且在末尾添加量词
不会允许它在匹配的组中延伸

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