谷歌表格:REGEXREPLACE匹配除特定模式外的所有内容

3
我会尝试替换此字符串中的所有内容:

[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029

除了以下数字:

1303222074 1403281851 1307239335 1403277567 1410315029

我已经构建了一个正则表达式来匹配它们:

1[0-9]{9}

但是我还没有想出如何做相反的事情,也就是除了所有匹配项之外的所有内容...


在提问之前,你应该确保先搜索一下。这个问题已经在这个网站上得到了解答。搜索一下“反转正则表达式”。 - undefined
3个回答

2
您也可以使用动态本地函数来完成此操作:
=REGEXEXTRACT(A1,rept("(\d{10}).*",counta(split(regexreplace(A1,"\d{10}","@"),"@"))-1))

基本上,它首先通过所需的字符串进行拆分,以确定它出现的次数,然后重复正则表达式以动态创建相应数量的捕获组,因此最终只留下这些值。

enter image description here


1

谷歌电子表格使用Re2正则引擎,不支持许多有用的功能,可以帮助您完成操作。因此,基本解决方法可能有所帮助:

首先匹配并捕获要保留的内容:

模式:[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)

替换:$1(后面加一个空格)

demo

因此,可能会出现类似以下内容:

=TRIM(REGEXREPLACE("[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029"; "[0-9]*(?:[0-9]{0,9}[^0-9]+)*(?:([0-9]{9,})|[0-9]*\z)"; "$1 "))

@Bastien:不幸的是,我无法在Google电子表格中测试这个模式,但请刷新你的浏览器,我的答案已经改变,并使用一个正确的替换字符串。也许你需要调整语法,但思路在这里。 - undefined
@Bastien:你似乎不明白它的工作原理。看一下这个链接:https://regex101.com/r/kB3pK2/1 你只需要在结果后面修剪一下就可以了。 - undefined
我承认我对此有点迷茫。我通过提到的链接检查了你的工作,但是我只能说当我在字符串上执行 =REGEXEXTRACT(K25; "[^0-9]*(?:([0-9]{9,})|[0-9]+|\z)")(其中K25是包含上述示例中的字符串的单元格)时,它根本没有提取任何内容(尽管没有错误)。 - undefined
伙计,谢谢,但只是一个快速修复:=TRIM(REGEXREPLACE("[JGMORGAN - BANK2] n° 10 NEWYORK, n° 222 CAEN, MONTELLIER, VANNES / TARARTA TIs 1303222074, 1403281851 & 1307239335 et Cloture TIs 1403277567, 1410315029"; "[0-9](?:[0-9]{0,9}[^0-9]+)(?:([0-9]{9,})|\z)"; "$1 "))(使用“;”代替“,”) - undefined
@Bastien:尝试使用这个更改。 - undefined
显示剩余3条评论

0
首先感谢Casimir的帮助。这给了我一个想法,用内置函数和强大的正则表达式是不可能实现的哈哈。 我发现我可以为自己的目的制作一个自制函数(是的,我不是很“时髦”)。 它的代码写得不太好,会返回重复项。但与其正确修复它,我使用内置的UNIQUE()函数来摆脱它们;虽然有点丑陋,而且我也有点懒,但它能完成工作,即列出特定正则表达式(即:1[0-9]{9})的所有匹配项。下面是代码:

function ti_extract(input) {
  var tab_tis = new Array();
  var tab_strings = new Array();


  tab_tis.push(input.match(/1[0-9]{9}/)); // get the TI and insert in tab_tis

  var string_modif = input.replace(tab_tis[0], " "); // modify source string (remove everything except the TI)
  tab_strings.push(string_modif); // insert this new string in the table

  var v = 0;
  var patt = new RegExp(/1[0-9]{9}/);
  var fin = patt.test(tab_strings[v]);

  var first_string = tab_strings[v];


  do {
    first_string = tab_strings[v]; // string 0, or the string with the first removed TI
    tab_tis.push(first_string.match(/1[0-9]{9}/)); // analyze the string and get the new TI to put it in the table

    var string_modif2 = first_string.replace(tab_tis[v], " "); // modify the string again to remove the new TI from the old string
    tab_strings.push(string_modif2);

    v += 1;
  }
  while(v < 15)

  return tab_tis;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接