Google Scripts将函数替换为CAPS中的正则表达式的前缀

时间:2014-01-22 15:02:20

标签: regex google-apps-script

在GAS中,使用.replace(),是否可以匹配长文本字符串中的任何术语,该文本字符串是至少5个连续的ALL CAPS字符(可能在那里有1个空格)并且用字符串作为前缀,例如作为] [?文本字符串中可能有多个匹配项,因此我想插入以ALLCAPS类别开头和结尾的标记。

相似类型的文本的一个示例是(结构相似,但与其他敏感数据):

“度假:主管批准 - 频率每年1-3次;持续时间不超过5天。病假:主管批准 - 频率高达每年8次,连续不超过5天,无MD借口。联邦:人力资源部批准 - 必要时频率,必须至少提前14天批准,或在员工确定需要的24小时内批准。“

我通过Serge了解到如何取代全球,这是一个很大的帮助,但我研究的正则表达式越多,它就会越混乱。我尝试用全部大写的regexp替换特定的术语,但是失败了。我认为我可以通过并提取所有全部大写regexp并使用它们替换多个值,但似乎这将是一个很长的路要走。

是否有可能在几行中使上述文字看起来像这样: “] [假期:由主管批准 - 频率每年1-3次;持续时间不超过5天。] [SICK LEAVE:由主管批准 - 频率高达每年8次,连续不超过5天,无MD借口。 ] [FMLA联邦:人力资源部批准 - 必要时频率,必须至少提前14天批准,或在员工确定需要的24小时内批准。“

我的意图是分裂到]这意味着新单元格将以全部大写字母开头,并以]结束。我有代码将文本转换为数组(有很多条目),然后使用.replace()在数组中查找和替换,并将值设置回表单,但我只是不知道如果有任何一种方法可以使用前缀(我的研究表明在GAS中无法进行回顾),或者为了获取allcaps值,请添加字符串“] [”,并将其放回去。

如果这是要求太多,或者感觉我没有包含任何代码,这是Serge已经帮助过的第一部分:Looking for a Google script that will perform CTRL+F replace for a string

这是我用过的代码,结合了Serge之前的帮助和新建议。在运行全部大写之前,我不得不用一个术语修复一些案例问题,因为有些人不能遵循模板,但它有效。

function insertSplitMarkers(){
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Freq Iso');
      var data = sh.getRange(2,1,sh.getLastRow(),sh.getLastColumn()).getValues();// get all data
      var regexp = /(([A-Z]\s*){5,})/g;
      for(var n=0;n<data.length;n++){
        for(var m=0;m<data[0].length;m++){
          if(typeof(data[n][m])=='string'){ // if it is a string
            data[n][m]=data[n][m].replace(/Interventions/g,'INTERVENTIONS');// use the regex replace with /g parameter meaning "globally"
            data[n][m]=data[n][m].replace(regexp, "][$1");        
          }
        }
      }
      Logger.log(data);
      sh.getRange(2,1,data.length,data[0].length).setValues(data);
    }

2 个答案:

答案 0 :(得分:0)

看起来这会做你想要的,虽然它也会选择aoAOEOUE

var yourString = "VACATION: Approved by Supervisor - Frequency 1-3 times per year; duration not to exceed 5 days. SICK LEAVE: Approved by Supervisor - Frequency up to 8 per year, no more than 5 days consecutively without MD excuse. FMLA FEDERAL: Approved by HR - Frequency as needed, must be approved at least 14 days in advance, or within 24 hours of employee's identified need.";

var regexp = /(([A-Z]\s*){5,})/g;

var newString = yourString.replace(regexp, "][$1");

Logger.log(newString);

答案 1 :(得分:0)

@ user3169581我已经稍微调整了你的正则表达式以试图消除所需短语周围的匹配空白并确保你获得所需的短语,它需要在替换中进行一些调整:

var regexp = /\b([A-Z\s]{5,})(:)/g
...
data[n][m] = data[n][m].replace(regexp,"][$2$3")

使用匹配工具匹配regex101:http://regex101.com/r/rD5kS9

HTH

编辑:出于某种原因,当我开始这个回复时,现有的答案没有出现在我面前。原谅冗余。