亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在分隔字符串中,僅當子字符串與替換值匹配時才替換分隔符之間的子字符串

在分隔字符串中,僅當子字符串與替換值匹配時才替換分隔符之間的子字符串

侃侃爾雅 2023-09-21 17:18:11
我需要在分隔字符串中,僅當子字符串與替換值匹配時才替換分隔符之間的子字符串在 Google 表格中使用它配套的var ifind = ["AA", "CaaL"];var ireplace = ["zz", "Bob"];zz replaces AABob replaces CaaL我有| Id | Segment            ||----|--------------------|| 1  | AAA AA|AA|CaaL AA  || 2  | AAA-AA|AA|CaaL     || 3  | AAA, AA|AA|AA      || 4  | AA                 || 5  | AA AA              || 6  | AA, AA             || 7  |                    || 8  | CaaL               || 9  | AA                 |我需要| Id | Segment           ||----|-------------------|| 1  | AAA AA|zz|CaaL AA || 2  | AAA-AA|zz|Bob     || 3  | AAA, AA|zz|zz     || 4  | zz                || 5  | AA AA             || 6  | AA, AA            || 7  |                   || 8  | Bob               || 9  | zz                |我已經嘗試過(除其他外)return [iFinds.reduce((str, k) => str.replace(new RegExp('\\b'+k+'\\b','g'),map[k]), input[0])];and return [iFinds.reduce((str, k) => str.replace(new RegExp('(?![ .,]|^)?(\\b' + k + '\\b)(?=[., ]|$)','g'),map[k]), input[0])];andreturn [iFinds.reduce((str, k) => str.split(k).join (map[k]), input[0])];我的功能(來自這里)function findReplace_mod1() {  const ss = SpreadsheetApp.getActiveSheet();  const col = ss.getRange(2, 3, ss.getLastRow()).getValues();    var ifind = ["AA", "Caal"];  var ireplace = ["zz", "Bob"];    var map = {};  ifind.forEach(function(item, i) {    map[item] = ireplace[i];  });    //const map = { Fellow: 'AAA', bob: 'BBB' };  const iFinds = Object.keys(map);  ss.getRange(2, 3, ss.getLastRow()).setValues(col.map(fr));  function fr(input) {    return [iFinds.reduce((str, k) => str.replace(k, map[k]), input[0])];  }}謝謝
查看完整描述

2 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

你的固定功能可以是這樣的


function findReplace_mod1() {

  const ss = SpreadsheetApp.getActiveSheet();

  const col = ss.getRange(2, 3, ss.getLastRow()).getValues();

  var ifind = ["AA", "CaaL"];

  var ireplace = ["zz", "Bob"];

  

  var map = {};

  ifind.forEach(function(item, i) {

    map[item] = ireplace[i];

  });

  

  //const map = { Fellow: 'AAA', bob: 'BBB' };

  const regex = new RegExp("(?<![^|])(?:" + ifind.join("|") + ")(?![^|])", "g");

  ss.getRange(2, 3, ss.getLastRow()).setValues(col.map(fr));


  function fr(input) {

    return input.map(c => c.replace(regex, (x) => map[x]));

  }

}

圖案看起來像


/(?<![^|])(?:AA|CaaL)(?![^|])/g

在哪里

  • (?<![^|])|- 是一個負向后查找,如果緊鄰當前位置左側的字符串有 或 開頭,則匹配失敗

  • (?:AA|CaaL)- 一個AACaaL

  • (?![^|])|- 是負向前瞻,如果當前位置右側緊鄰字符串的 或 結尾,則匹配失敗。

請參閱在線正則表達式演示(因為該演示是針對單個多行字符串而不是一組單獨的字符串運行,所以負向查找被替換為正向查找)。


查看完整回答
反對 回復 2023-09-21
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

要替換的字符串

  • |或 字符串開頭^

  • |或 字符串結尾$

正則表達式需要是

str.replace(new?Regexp(`(\\||^)${k}(\\||$)`),?`$1${map[k]}$2`)

/*<ignore>*/console.config({maximize:true,timeStamps:false,autoScroll:false});/*</ignore>*/

function findReplace_mod2() {

? const col = [['AAA AA|AA|CaaL AA'], ['AA'], ['AAA-AA|AA|CaaL']];

? const map = { AA: 'zz', CaaL: 'Bob' };

? const iFinds = Object.keys(map);

? console.info(col.map(fr));


? function fr(input) {

? ? return [iFinds.reduce((str, k) => str.replace(new RegExp(`(\\||^)${k}(\\||$)`), `$1${map[k]}$2`), input[0])];

? }

}


findReplace_mod2();


查看完整回答
反對 回復 2023-09-21
  • 2 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號